test_multiprocessing.py revision f9e9a6f403af61c6aead4cfe766fb1efbb058171
176cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller#!/usr/bin/env python 276cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller 3dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 4dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Unit tests for the multiprocessing package 5dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 6dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 7dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport unittest 8dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport Queue 9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time 10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys 11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os 12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc 13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal 14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array 15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket 16dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random 17dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging 18c4920e86ef7511b4e858028e870b1811437a71d0Mark Dickinsonfrom test import test_support 191b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerfrom StringIO import StringIO 203db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray_multiprocessing = test_support.import_module('_multiprocessing') 21c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti# import threading after _multiprocessing to raise a more relevant error 22613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# message: "No module named _multiprocessing". _multiprocessing is not compiled 23613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# without thread support. 24613b4cf28337902a586f259c6144083771fc06e5Victor Stinnerimport threading 253db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray 2637040cdace1982772e5f35e4acfa13861d72065dJesse Noller# Work around broken sem_open implementations 273db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murraytest_support.import_module('multiprocessing.synchronize') 2837040cdace1982772e5f35e4acfa13861d72065dJesse Noller 29dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.dummy 30dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.connection 31dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.managers 32dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.heap 33dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.pool 34dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 35dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing import util 36dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 37a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtintry: 38a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin from multiprocessing.sharedctypes import Value, copy 39a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin HAS_SHAREDCTYPES = True 40a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtinexcept ImportError: 41a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin HAS_SHAREDCTYPES = False 42a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin 43dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 44dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 45dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 46dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 47e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str 48dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 49dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 50dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants 51dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 52dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 53dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING 54654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG 55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1 57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False # making true makes tests take a lot longer 58dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # and can sometimes cause some non-serious 59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # failures because some calls block a bit 60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # longer than expected 61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS: 62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4 63dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse: 64dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1 65dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing, 67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'HAVE_BROKEN_SEM_GETVALUE', False) 68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 699a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32") 709a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 7236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# Some tests require ctypes 7336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# 7436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 7536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunatry: 7613623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan from ctypes import Structure, c_int, c_double 7736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunaexcept ImportError: 7836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna Structure = object 7936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna c_int = c_double = None 8036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 8136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# 82dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish 83dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 84dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 85dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object): 86dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self, func): 88dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.func = func 89dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = None 90dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 91dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __call__(self, *args, **kwds): 92dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = time.time() 93dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 94dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.func(*args, **kwds) 95dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson finally: 96dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = time.time() - t 97dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 98dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 99dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases 100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object): 103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'manager', 'threads') 105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertTimingAlmostEqual(self, a, b): 107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if CHECK_TIMINGS: 108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(a, b, 1) 109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertReturnsIfImplemented(self, value, func, *args): 111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = func(*args) 113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.assertEqual(value, res) 117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1184eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou # For the sanity of Windows users, rather than crashing or freezing in 1194eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou # multiple ways. 1204eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def __reduce__(self, *args): 1214eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou raise NotImplementedError("shouldn't try to pickle a test case") 1224eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou 1234eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou __reduce_ex__ = __reduce__ 1244eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou 125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore 127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self): 130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.get_value() 132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._Semaphore__value 135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._value 138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise NotImplementedError 140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases 143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase): 146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_current(self): 150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 1545bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller authkey = current.authkey 155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(current.is_alive()) 1575bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertTrue(not current.daemon) 158b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti self.assertIsInstance(authkey, bytes) 159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(len(authkey) > 0) 1605bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.ident, os.getpid()) 1615bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.exitcode, None) 162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1634eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 1644eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test(cls, q, *args, **kwds): 1654eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou current = cls.current_process() 166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(args) 167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(kwds) 1685bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(current.name) 1694eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou if cls.TYPE != 'threads': 1705bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(bytes(current.authkey)) 171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(current.pid) 172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_process(self): 174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue(1) 175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.Event() 176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args = (q, 1, 2) 177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson kwargs = {'hello':23, 'bye':2.54} 178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson name = 'SomeProcess' 179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test, args=args, kwargs=kwargs, name=name 181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1825bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1862623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.authkey, current.authkey) 1872623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.is_alive(), False) 1882623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.daemon, True) 189aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(self.active_children()) is list) 1915bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1952623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.exitcode, None) 1962623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.is_alive(), True) 197aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1992623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), args[1:]) 2002623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), kwargs) 2012623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), p.name) 202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 2032623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), current.authkey) 2042623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), p.pid) 205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2082623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.exitcode, 0) 2092623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.is_alive(), False) 210aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2124eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 2134eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_terminate(cls): 214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(1000) 215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_terminate) 2215bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), True) 225aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 2265bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.terminate() 229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(p.join) 231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(join(), None) 232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(join.elapsed, 0.0) 233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), False) 235aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2395bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller # XXX sometimes get p.exitcode == 0 on Windows ... 2405bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller #self.assertEqual(p.exitcode, -signal.SIGTERM) 241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_cpu_count(self): 243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = multiprocessing.cpu_count() 245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = 1 247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(cpus) is int) 248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(cpus >= 1) 249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_active_children(self): 251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(self.active_children()), list) 252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=time.sleep, args=(DELTA,)) 254aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 257aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 260aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2624eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 2634eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_recursion(cls, wconn, id): 264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from multiprocessing import forking 265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wconn.send(id) 266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(id) < 2: 267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(2): 2684eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou p = cls.Process( 2694eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou target=cls._test_recursion, args=(wconn, id+[i]) 270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_recursion(self): 275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, wconn = self.Pipe(duplex=False) 276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_recursion(wconn, []) 277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [] 280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson while rconn.poll(): 281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result.append(rconn.recv()) 282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [ 284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [], 285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0], 286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 0], 287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 1], 288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1], 289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 0], 290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 1] 291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, expected) 293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process): 299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self): 301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.Process.__init__(self) 302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn, self.parent_conn = multiprocessing.Pipe() 303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def run(self): 305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for s in iter(self.child_conn.recv, None): 307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.send(s.upper()) 308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def submit(self, s): 311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson assert type(s) is str 312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(s) 313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.parent_conn.recv() 314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def stop(self): 316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(None) 317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase): 321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_subclassing(self): 325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser = _UpperCaser() 326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.start() 327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('hello'), 'HELLO') 328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('world'), 'WORLD') 329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.stop() 330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.join() 331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q): 337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'empty'): 338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.empty() 339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == 0 341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize): 343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'full'): 344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.full() 345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == maxsize 347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase): 350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 3524eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 3534eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_put(cls, queue, child_can_start, parent_can_continue): 354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(6): 356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.get() 357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_put(self): 360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson MAXSIZE = 6 361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue(maxsize=MAXSIZE) 362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_put, 367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 3695bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(1) 376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2, True) 377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3, True, None) 378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4, False) 379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5, False, None) 380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put_nowait(6) 381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # the values may be in buffer but not yet in pipe so sleep a bit 383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), True) 387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put = TimingWrapper(queue.put) 389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put_nowait = TimingWrapper(queue.put_nowait) 390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False) 392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, None) 395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put_nowait, 7) 398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put_nowait.elapsed, 0) 399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1) 401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1) 402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2) 404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3) 407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3) 408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 4174eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 4184eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_get(cls, queue, child_can_start, parent_can_continue): 419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 420da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #queue.put(1) 421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2) 422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3) 423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4) 424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5) 425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_get(self): 428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_get, 434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 4365bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 447da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson # Hangs unexpectedly, remove for now 448da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #self.assertEqual(queue.get(), 1) 449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True, None), 2) 450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True), 3) 451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(timeout=1), 4) 452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get_nowait(), 5) 453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(queue.get) 457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get_nowait = TimingWrapper(queue.get_nowait) 458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False) 460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, None) 463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get_nowait) 466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get_nowait.elapsed, 0) 467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, True, TIMEOUT1) 469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, TIMEOUT2) 472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3) 475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3) 476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 4794eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 4804eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_fork(cls, queue): 481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10, 20): 482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # note that at this point the items may only be buffered, so the 484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process cannot shutdown until the feeder thread has finished 485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pushing items onto the pipe. 486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_fork(self): 488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Old versions of Queue would fail to create a new feeder 489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # thread for a forked process if the original process had its 490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # own feeder thread. This test checks that this no longer 491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # happens. 492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # put items on queue so that main process starts a feeder thread 496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait to make sure thread starts before we fork a new process 500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # fork process 503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_fork, args=(queue,)) 504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check that all expected items are in the queue 507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(20): 508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), i) 509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, queue.get, False) 510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_qsize(self): 514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue() 515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(1) 520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(5) 522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 2) 523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 5284eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 5294eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_task_done(cls, q): 530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for obj in iter(q.get, None): 531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.task_done() 533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_task_done(self): 535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.JoinableQueue() 536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'): 53836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna self.skipTest("requires 'queue.task_done()' method") 539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson workers = [self.Process(target=self._test_task_done, args=(queue,)) 541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(4)] 542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.join() 550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(None) 553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase): 562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_lock(self): 564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(False), False) 567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((ValueError, threading.ThreadError), lock.release) 569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rlock(self): 571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.RLock() 572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((AssertionError, RuntimeError), lock.release) 579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 58082eb5902ce169be81110c79662b772b904cd00fcJesse Noller def test_lock_context(self): 58182eb5902ce169be81110c79662b772b904cd00fcJesse Noller with self.Lock(): 58282eb5902ce169be81110c79662b772b904cd00fcJesse Noller pass 58382eb5902ce169be81110c79662b772b904cd00fcJesse Noller 584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase): 586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_semaphore(self, sem): 588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(False), False) 594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_semaphore(self): 601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(2) 602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(3, get_value, sem) 605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(4, get_value, sem) 607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_bounded_semaphore(self): 609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.BoundedSemaphore(2) 610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Currently fails on OS/X 612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #if HAVE_GETVALUE: 613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertRaises(ValueError, sem.release) 614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertReturnsIfImplemented(2, get_value, sem) 615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(0) 621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson acquire = TimingWrapper(sem.acquire) 622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False), False) 624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, None), False) 627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, TIMEOUT1), False) 630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0) 631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(True, TIMEOUT2), False) 633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2) 634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(timeout=TIMEOUT3), False) 636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3) 637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase): 640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 6414eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 6424eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def f(cls, cond, sleeping, woken, timeout=None): 643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.release() 645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.wait(timeout) 646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.release() 647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def check_invariant(self, cond): 650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # this is only supposed to succeed when there are no sleepers 651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleepers = (cond._sleeping_count.get_value() - 654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond._woken_count.get_value()) 655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sleepers, 0) 656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(cond._wait_semaphore.get_value(), 0) 657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify(self): 661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 6665bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 6705bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for both children to start sleeping 674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up one process/thread 682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check one process/thread has woken up 687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, woken) 689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up another 691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check other has woken up 696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, woken) 698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify_all(self): 704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some threads/processes which will timeout 709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, 711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 7125bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, 716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 717a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them all to sleep 721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all timed out 725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.acquire() 727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some more threads/processes 733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 7355bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 739a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them to all sleep 743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake them all up 751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify_all() 753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all woken 756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(6, get_value, woken) 758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(cond.wait) 765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = wait(TIMEOUT1) 767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(res, None) 769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase): 773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 7744eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 7754eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_event(cls, event): 776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(TIMEOUT2) 777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_event(self): 780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event = self.Event() 781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(event.wait) 782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 783c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti # Removed temporarily, due to API shear, this does not 784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # work with threading._Event objects. is_set == isSet 78502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), False) 786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 78702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # Removed, threading.Event.wait() will return the value of the __flag 78802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # instead of None. API Shear with the semaphore backed mp.Event 78902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(0.0), False) 790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 79102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), False) 792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # See note above on the API differences 79702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), True) 79802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 80002cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), True) 801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertEqual(event.is_set(), True) 803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.clear() 805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #self.assertEqual(event.is_set(), False) 807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_event, args=(event,)).start() 80902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase): 816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 81736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ALLOWED_TYPES = ('processes',) 81836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson codes_values = [ 820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('i', 4343, 24234), 821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('d', 3.625, -4.25), 822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('h', -232, 234), 823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('c', latin('x'), latin('y')) 824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 82655d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou def setUp(self): 82755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou if not HAS_SHAREDCTYPES: 82855d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou self.skipTest("requires multiprocessing.sharedctypes") 82955d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou 8304eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 8314eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test(cls, values): 8324eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou for sv, cv in zip(values, cls.codes_values): 833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sv.value = cv[2] 834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_value(self, raw=False): 837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.RawValue(code, value) 839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.Value(code, value) 842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[1]) 846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process(target=self._test, args=(values,)) 848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[2]) 853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawvalue(self): 855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_value(raw=True) 856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock(self): 858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val1 = self.Value('i', 5) 859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = val1.get_lock() 860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = val1.get_obj() 861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val2 = self.Value('i', 5, lock=None) 863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = val2.get_lock() 864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = val2.get_obj() 865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val3 = self.Value('i', 5, lock=lock) 868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = val3.get_lock() 869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = val3.get_obj() 870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8726ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Value('i', 5, lock=False) 873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8766ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue') 8776ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 8786ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawValue('i', 5) 8796ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 8806ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 8816ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase): 884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 88536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ALLOWED_TYPES = ('processes',) 88636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 8874eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 8884eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def f(cls, seq): 889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1, len(seq)): 890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq[i] += seq[i-1] 891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 89236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_array(self, raw=False): 894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831] 895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.RawArray('i', seq) 897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.Array('i', seq) 899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(len(arr), len(seq)) 901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(arr[3], seq[3]) 902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[2:7]), list(seq[2:7])) 903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4]) 905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.f(seq) 909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(arr,)) 911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 91636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawarray(self): 918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_array(raw=True) 919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 92036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 921f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson def test_array_accepts_long(self): 922f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson arr = self.Array('i', 10L) 923f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson self.assertEqual(len(arr), 10) 924f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson raw_arr = self.RawArray('i', 10L) 925f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson self.assertEqual(len(raw_arr), 10) 926f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson 927f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson @unittest.skipIf(c_int is None, "requires _ctypes") 928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock_obj(self): 929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr1 = self.Array('i', range(10)) 930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = arr1.get_lock() 931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = arr1.get_obj() 932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr2 = self.Array('i', range(10), lock=None) 934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = arr2.get_lock() 935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = arr2.get_obj() 936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr3 = self.Array('i', range(10), lock=lock) 939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = arr3.get_lock() 940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = arr3.get_obj() 941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 9436ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Array('i', range(10), lock=False) 944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 9466ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, 9476ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.Array, 'i', range(10), lock='notalock') 9486ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 9496ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawArray('i', range(10)) 9506ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 9516ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase): 958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_list(self): 962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = self.list(range(10)) 963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = self.list() 966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], []) 967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b.extend(range(5)) 969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], range(5)) 970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2], 2) 972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2:10], [2,3,4]) 973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b *= 2 975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) 976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6]) 978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = [a, b] 982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.list(d) 983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual( 984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e[:], 985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]] 986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson f = self.list([a]) 989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.append('hello') 990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']]) 991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_dict(self): 993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = self.dict() 994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson indices = range(65, 70) 995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in indices: 996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[i] = chr(i) 997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices)) 998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.keys()), indices) 999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.values()), [chr(i) for i in indices]) 1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices]) 1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_namespace(self): 1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n = self.Namespace() 1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.name = 'Bob' 1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.job = 'Builder' 1006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n._hidden = 'hidden' 1007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual((n.name, n.job), ('Bob', 'Builder')) 1008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del n.job 1009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(str(n), "Namespace(name='Bob')") 1010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(hasattr(n, 'name')) 1011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(not hasattr(n, 'job')) 1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0): 1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(wait) 1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return x*x 1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase): 1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_apply(self): 1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson papply = self.pool.apply 1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (5,)), sqr(5)) 1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3)) 1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_map(self): 1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pmap = self.pool.map 1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10))) 1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(100), chunksize=20), 1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson map(sqr, range(100))) 1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 10337530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller def test_map_chunksize(self): 10347530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller try: 10357530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1) 10367530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller except multiprocessing.TimeoutError: 10377530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.fail("pool.map_async with chunksize stalled on null list") 10387530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller 1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async(self): 1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) 1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(get(), 49) 1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async_timeout(self): 1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2)) 1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2) 1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2) 1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap(self): 1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(it), map(sqr, range(10))) 1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(1000), chunksize=100) 1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1000): 1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap_unordered(self): 1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000)) 1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000), chunksize=53) 1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_make_pool(self): 1073dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = multiprocessing.Pool(3) 1074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(3, len(p._pool)) 1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.close() 1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'manager': 1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # On Unix a forked process increfs each shared object to 1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # which its parent process held a reference. If the 1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # forked process gets terminated then there is likely to 1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # be a reference leak. So to prevent 1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # _TestZZZNumberOfObjects from failing we skip this test 1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # when using a manager. 1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = self.pool.map_async( 1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep, [0.1 for i in range(10000)], chunksize=1 1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.pool.terminate() 1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(self.pool.join) 1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join() 1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(join.elapsed < 0.2) 1095654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1096654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase): 1097654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1098654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller ALLOWED_TYPES = ('processes', ) 1099654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller def test_pool_worker_lifetime(self): 1100654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p = multiprocessing.Pool(3, maxtasksperchild=10) 1101654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(3, len(p._pool)) 1102654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller origworkerpids = [w.pid for w in p._pool] 1103654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Run many tasks so each worker gets replaced (hopefully) 1104654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results = [] 1105654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for i in range(100): 1106654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results.append(p.apply_async(sqr, (i, ))) 1107654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Fetch the results and verify we got the right answers, 1108654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # also ensuring all the tasks have completed. 1109654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for (j, res) in enumerate(results): 1110654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(res.get(), sqr(j)) 1111654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Refill the pool 1112654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p._repopulate_pool() 11133bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # Wait until all workers are alive 11143bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna countdown = 5 11153bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna while countdown and not all(w.is_alive() for w in p._pool): 11163bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna countdown -= 1 11173bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna time.sleep(DELTA) 1118654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller finalworkerpids = [w.pid for w in p._pool] 11193bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # All pids should be assigned. See issue #7805. 11203bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna self.assertNotIn(None, origworkerpids) 11213bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna self.assertNotIn(None, finalworkerpids) 11223bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # Finally, check that the worker pids have changed 1123654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids)) 1124654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.close() 1125654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.join() 1126654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left 1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase): 1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because test cases are sorted alphabetically, this one will get 1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # run after all the other tests for the manager. It tests that 1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # there have been no "reference leaks" for the manager's shared 1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # objects. Note the comment in _TestPool.test_terminate(). 1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_number_of_objects(self): 1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson EXPECTED_NUMBER = 1 # the pool object is still alive 1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.active_children() # discard dead process objs 1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson gc.collect() # do garbage collection 1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson refs = self.manager._number_of_objects() 11437314b38168da53863136d1937059fc0ac4883a56Jesse Noller debug_info = self.manager._debug_info() 1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if refs != EXPECTED_NUMBER: 11457fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller print self.manager._debug_info() 11467314b38168da53863136d1937059fc0ac4883a56Jesse Noller print debug_info 1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(refs, EXPECTED_NUMBER) 1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class 1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError 1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object): 1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self): 1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 'f()' 1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def g(self): 1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise ValueError 1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _h(self): 1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return '_h()' 1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz(): 1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson yield i*i 1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy): 1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _exposed_ = ('next', '__next__') 1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __iter__(self): 1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self 1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def next(self): 1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('next') 1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __next__(self): 1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('__next__') 1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager): 1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar) 1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h')) 1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy) 1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase): 1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_mymanager(self): 1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = MyManager() 1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = manager.Foo() 1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = manager.Bar() 1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson baz = manager.baz() 1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)] 1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)] 1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo_methods, ['f', 'g']) 1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar_methods, ['f', '_h']) 1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.f(), 'f()') 1204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, foo.g) 1205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo._callmethod('f'), 'f()') 1206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(RemoteError, foo._callmethod, '_h') 1207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.f(), 'f()') 1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._h(), '_h()') 1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('f'), 'f()') 1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('_h'), '_h()') 1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(baz), [i*i for i in range(10)]) 1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization 1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue() 1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue(): 1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return _queue 1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager): 1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class used by server process''' 1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue) 1228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager): 1230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class which specifies the same interface as QueueManager''' 1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue') 1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib' 1235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase): 1237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 12404eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 12414eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _putter(cls, address, authkey): 1242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager2( 1243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=address, authkey=authkey, serializer=SERIALIZER 1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.connect() 1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager.get_queue() 1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(('hello world', None, True, 2.25)) 1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_remote(self): 1250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson authkey = os.urandom(32) 1251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager( 1253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=('localhost', 0), authkey=authkey, serializer=SERIALIZER 1254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._putter, args=(manager.address, authkey)) 1258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2 = QueueManager2( 1261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=manager.address, authkey=authkey, serializer=SERIALIZER 1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2.connect() 1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager2.get_queue() 1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Note that xmlrpclib will deserialize object as a list not a tuple 1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), ['hello world', None, True, 2.25]) 1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because we are using xmlrpclib for serialization instead of 1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pickle this will cause a serialization error. 1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Exception, queue.put, time.sleep) 1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Make queue finalizer run before the server is stopped 1274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del queue 1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1277459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase): 1278459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 12794eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 12804eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _putter(cls, address, authkey): 1281459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1282459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=address, authkey=authkey, serializer=SERIALIZER) 1283459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.connect() 1284459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1285459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue.put('hello world') 1286459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1287459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def test_rapid_restart(self): 1288459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller authkey = os.urandom(32) 1289459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 129054f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou address=('localhost', 0), authkey=authkey, serializer=SERIALIZER) 129187d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin srvr = manager.get_server() 129287d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin addr = srvr.address 129387d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin # Close the connection.Listener socket which gets opened as a part 129487d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin # of manager.get_server(). It's not needed for the test. 129587d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin srvr.listener.close() 1296459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1297459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1298459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p = self.Process(target=self._putter, args=(manager.address, authkey)) 1299459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p.start() 1300459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1301459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller self.assertEqual(queue.get(), 'hello world') 1302019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller del queue 1303459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.shutdown() 1304459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 130554f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou address=addr, authkey=authkey, serializer=SERIALIZER) 1306459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1307019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller manager.shutdown() 1308459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('') 1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase): 1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 13194eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 13204eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _echo(cls, conn): 1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for msg in iter(conn.recv_bytes, SENTINEL): 1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_connection(self): 1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 13295bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [1, 2.25, None] 1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello world') 1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson longmsg = msg * 10 1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = array.array('i', range(4)) 1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(conn.fileno()), int) 1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send(seq), None) 1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), seq) 1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(msg), None) 1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = list(arr) + [0] * (10 - len(arr)) 1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer), 1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr)) 1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize), 1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = bytearray(latin(' ' * 40)) 1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(longmsg), None) 1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = conn.recv_bytes_into(buffer) 1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except multiprocessing.BufferTooShort, e: 1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(e.args, (longmsg,)) 1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.fail('expected BufferTooShort, got %s' % res) 1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson poll = TimingWrapper(conn.poll) 1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(), False) 1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), False) 1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) 1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(None) 1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), True) 1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), None) 1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson really_big_msg = latin('X') * (1024 * 1024 * 16) # 16Mb 1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(really_big_msg) 1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), really_big_msg) 1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) # tell child to quit 1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() 1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.readable, True) 1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.writable, True) 1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv) 1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv_bytes) 1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_duplex_false(self): 1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = self.Pipe(duplex=False) 1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.send(1), None) 1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.recv(), 1) 1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.readable, True) 1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.writable, False) 1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.readable, False) 1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.writable, True) 1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, reader.send, 2) 1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.recv) 1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.poll) 1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_spawn_close(self): 1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # We test that a pipe connection can be closed by parent 1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process immediately after child is spawned. On Windows this 1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # would have sometimes failed on old versions because 1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # child_conn would be closed before the child got a chance to 1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # duplicate it. 1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() # this might complete before child initializes 1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello') 1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) 1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sendbytes(self): 1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('abcdefghijklmnopqrstuvwxyz') 1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a, b = self.Pipe() 1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg) 1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg) 1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 5) 1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[5:]) 1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 7, 8) 1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[7:7+8]) 1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26) 1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26, 0) 1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 27) 1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 22, 5) 1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 26, 1) 1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, -1) 1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) 1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase): 1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 14694eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 14704eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test(cls, address): 14714eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou conn = cls.connection.Client(address) 1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send('hello') 1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_listener_client(self): 1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for family in self.connection.families: 1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=family) 1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test, args=(l.address,)) 14795bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = l.accept() 1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), 'hello') 1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.close() 1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes 1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1488da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase): 1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _listener(self, conn, families): 1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=fam) 1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.address) 1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = l.accept() 1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = socket.socket() 1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.bind(('localhost', 0)) 1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.getsockname()) 1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.listen(1) 1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn, addr = l.accept() 1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.recv() 1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _remote(self, conn): 1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for (address, msg) in iter(conn.recv, None): 1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = self.connection.Client(address) 1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.send(msg.upper()) 1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address, msg = conn.recv() 1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = socket.socket() 1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.connect(address) 1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.sendall(msg.upper()) 1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_pickling(self): 1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.allow_connection_pickling() 1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except ImportError: 1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson families = self.connection.families 1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn, lconn0 = self.Pipe() 1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp = self.Process(target=self._listener, args=(lconn0, families)) 1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.start() 1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn0.close() 1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, rconn0 = self.Pipe() 1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp = self.Process(target=self._remote, args=(rconn0,)) 1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.start() 1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn0.close() 1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = ('This connection uses family %s' % fam).encode('ascii') 1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(), msg.upper()) 1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send(None) 1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('This connection uses a normal socket') 1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(socket, 'fromfd'): 1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(100), msg.upper()) 1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # XXX On Windows with Py2.6 need to backport fromfd() 1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson discard = lconn.recv_bytes() 1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.send(None) 1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.close() 1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.close() 1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.join() 1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.join() 1570da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase): 1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_heap(self): 1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson iterations = 5000 1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson maxblocks = 50 1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks = [] 1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # create and destroy lots of blocks of different sizes 1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(iterations): 1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson size = int(random.lognormvariate(0, 1) * 1000) 1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = multiprocessing.heap.BufferWrapper(size) 1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks.append(b) 1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(blocks) > maxblocks: 1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson i = random.randrange(maxblocks) 1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del blocks[i] 1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # get the heap object 1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson heap = multiprocessing.heap.BufferWrapper._heap 1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # verify the state of the heap 1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all = [] 1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied = 0 1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for L in heap._len_to_seq.values(): 1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in L: 1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'free')) 1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in heap._allocated_blocks: 1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'occupied')) 1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied += (stop-start) 1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.sort() 1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(all)-1): 1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (arena, start, stop) = all[i][:3] 1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (narena, nstart, nstop) = all[i+1][:3] 1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue((arena != narena and nstart == 0) or 1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (stop == nstart)) 1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure): 1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _fields_ = [ 1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('x', c_int), 1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('y', c_double) 1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase): 1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 163055d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou def setUp(self): 163155d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou if not HAS_SHAREDCTYPES: 163255d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou self.skipTest("requires multiprocessing.sharedctypes") 163355d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou 16344eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 16354eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _double(cls, x, y, foo, arr, string): 1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x.value *= 2 1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y.value *= 2 1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x *= 2 1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y *= 2 1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value *= 2 1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(arr)): 1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[i] *= 2 1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sharedctypes(self, lock=False): 1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x = Value('i', 7, lock=lock) 1646bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl y = Value(c_double, 1.0/3.0, lock=lock) 1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = Value(_Foo, 3, 2, lock=lock) 1648bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl arr = self.Array('d', range(10), lock=lock) 1649bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl string = self.Array('c', 20, lock=lock) 1650a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin string.value = latin('hello') 1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._double, args=(x, y, foo, arr, string)) 1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(x.value, 14) 1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(y.value, 2.0/3.0) 1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.x, 6) 1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(foo.y, 4.0) 1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(arr[i], i*2) 1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(string.value, latin('hellohello')) 1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_synchronize(self): 1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_sharedctypes(lock=True) 1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_copy(self): 1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = _Foo(2, 5.0) 1669a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin bar = copy(foo) 1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x = 0 1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y = 0 1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.x, 2) 1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(bar.y, 5.0) 1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase): 1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 16834eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 16844eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_finalize(cls, conn): 1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Foo(object): 1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = Foo() 1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(a, conn.send, args=('a',)) 1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del a # triggers callback for a 1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = Foo() 1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b = util.Finalize(b, conn.send, args=('b',)) 1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # triggers callback for b 1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # does nothing because callback has already been called 1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del b # does nothing because callback has already been called 1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c = Foo() 1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(c, conn.send, args=('c',)) 1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d10 = Foo() 1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d10, conn.send, args=('d10',), exitpriority=1) 1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d01 = Foo() 1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d01, conn.send, args=('d01',), exitpriority=0) 1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d02 = Foo() 1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d02, conn.send, args=('d02',), exitpriority=0) 1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d03 = Foo() 1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d03, conn.send, args=('d03',), exitpriority=0) 1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('e',), exitpriority=-10) 1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100) 1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1715c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti # call multiprocessing's cleanup function then exit process without 1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # garbage collecting locals 1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util._exit_function() 1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson os._exit(0) 1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_finalize(self): 1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_finalize, args=(child_conn,)) 1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [obj for obj in iter(conn.recv, 'STOP')] 1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) 1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module 1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase): 1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_import(self): 174036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna modules = [ 1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing', 'multiprocessing.connection', 1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.heap', 'multiprocessing.managers', 1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.pool', 'multiprocessing.process', 174436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 'multiprocessing.reduction', 1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.synchronize', 'multiprocessing.util' 174636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ] 174736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 174836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna if c_int is not None: 174936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna # This module requires _ctypes 175036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna modules.append('multiprocessing.sharedctypes') 1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in modules: 1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson __import__(name) 1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson mod = sys.modules[name] 1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for attr in getattr(mod, '__all__', ()): 1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue( 1758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson hasattr(mod, attr), 1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '%r does not have attribute %r' % (mod, attr) 1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output 1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase): 1767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_enable_logging(self): 1771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(util.SUBWARNING) 1773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(logger is not None) 1774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.debug('this will not be printed') 1775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.info('nor will this') 1776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LOG_LEVEL) 1777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 17784eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 17794eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_level(cls, conn): 1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(logger.getEffectiveLevel()) 1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_level(self): 1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL1 = 32 1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL2 = 37 1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger = logging.getLogger() 1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_level = root_logger.level 1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = multiprocessing.Pipe(duplex=False) 1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LEVEL1) 1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL1, reader.recv()) 1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(logging.NOTSET) 1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(LEVEL2) 1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL2, reader.recv()) 1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(root_level) 1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(level=LOG_LEVEL) 1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1805814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 18069a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase): 18079a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 18089a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def handle(self, record): 18099a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert record.processName == multiprocessing.current_process().name 18109a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = True 18119a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 18129a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def test_logging(self): 18139a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler = logging.Handler() 18149a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler.handle = self.handle 18159a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = False 18169a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# # Bypass getLogger() and side-effects 18179a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger = logging.getLoggerClass()( 18189a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 'multiprocessing.test.TestLoggingProcessName') 18199a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.addHandler(handler) 18209a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.propagate = False 18219a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 18229a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.warn('foo') 18239a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert self.__handled 1824814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 18269a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321 18279a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 18289a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 18299a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase): 18309a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 183136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(WIN32, "skipped on Windows") 18329a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller def test_invalid_handles(self): 18339a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller conn = _multiprocessing.Connection(44977608) 18349a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, conn.poll) 18359a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, _multiprocessing.Connection, -1) 183636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 18379a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module 1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names): 1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = {} 1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in names: 1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = getattr(Source, name) 1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type(obj) == type(get_attributes): 1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = staticmethod(obj) 1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[name] = obj 1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return d 1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type): 1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = {} 1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson glob = globals() 185336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna Type = type.capitalize() 1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in glob.keys(): 1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if name.startswith('_Test'): 1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson base = glob[name] 1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type in base.ALLOWED_TYPES: 1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson newname = 'With' + Type + name[1:] 1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Temp(base, unittest.TestCase, Mixin): 1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result[newname] = Temp 1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__name__ = newname 1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__module__ = Mixin.__module__ 1865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return result 1866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases 1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object): 1872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'processes' 1873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing, ( 1875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'RawValue', 1877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'RawArray', 'current_process', 'active_children', 'Pipe', 1878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'connection', 'JoinableQueue' 1879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes') 1882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes) 1883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object): 1886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'manager' 1887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = object.__new__(multiprocessing.managers.SyncManager) 1889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(manager, ( 1890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 1892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager') 1896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager) 1897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object): 1900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'threads' 1901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.dummy.Process 1902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing.dummy, ( 1903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'current_process', 1905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'active_children', 'Pipe', 'connection', 'dict', 'list', 1906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads') 1910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads) 1911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 19120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase): 19130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz # TODO: add more tests for deliver/answer challenge. 19140c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_deliver_challenge_auth_failure(self): 19150c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 19160c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 19172a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 19180c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 19190c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 19200c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 19210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.deliver_challenge, 19220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 19230c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 19240c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_answer_challenge_auth_failure(self): 19250c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 19260c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def __init__(self): 19270c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count = 0 19280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 19290c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count += 1 19300c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz if self.count == 1: 19310c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz return multiprocessing.connection.CHALLENGE 19320c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz elif self.count == 2: 19332a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 19342a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'' 19350c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 19360c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 19370c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 19380c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.answer_challenge, 19390c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 19400c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 19417152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 19427152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585 19437152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 19447152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19457152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns): 19467152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller ns.test += 1 19477152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19487152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase): 19497152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def setUp(self): 19507152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr = multiprocessing.Manager() 19517152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns = self.mgr.Namespace() 19527152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns.test = 0 19537152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19547152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def tearDown(self): 19557152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr.shutdown() 19567152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19577152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_manager_initializer(self): 19587152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m = multiprocessing.managers.SyncManager() 19597152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, m.start, 1) 19607152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.start(initializer, (self.ns,)) 19617152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 19627152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.shutdown() 19637152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19647152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_pool_initializer(self): 19657152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, multiprocessing.Pool, initializer=1) 19667152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p = multiprocessing.Pool(1, initializer, (self.ns,)) 19677152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.close() 19687152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.join() 19697152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 19707152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 19721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes 19731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior 19741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 19751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19761b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q): 19771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller try: 19781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller item = q.get(block=False) 19791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller except Queue.Empty: 19801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pass 19811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19821b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q): 19831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 19841b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,)) 19851b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.start() 19861b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.join() 19871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19881b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x): 19891b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return x*x 19901b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19911b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process(): 19921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pool = multiprocessing.Pool(processes=4) 19931b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7]) 19941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19951b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object): 19961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def __init__(self, delegate): 19971b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate = delegate 19981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = None 19991b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20001b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller @property 20011b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def cache(self): 20021b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pid = os.getpid() 20031b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller # There are no race conditions since fork keeps only the running thread 20041b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller if pid != self._pid: 20051b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = pid 20061b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 20071b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return self._cache 20081b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20091b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def write(self, data): 20101b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self.cache.append(data) 20111b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20121b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def flush(self): 20131b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate.write(''.join(self.cache)) 20141b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 20151b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20161b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase): 20171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20181b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_queue_in_process(self): 20191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 20201b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=_TestProcess, args=(queue,)) 20211b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.start() 20221b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.join() 20231b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_pool_in_process(self): 20251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p = multiprocessing.Process(target=pool_in_process) 20261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.start() 20271b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.join() 20281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20291b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_flushing(self): 20301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller sio = StringIO() 20311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike = _file_like(sio) 20321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.write('foo') 20331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=lambda: flike.flush()) 20341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.flush() 20351b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller assert sio.getvalue() == 'foo' 20361b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 20371b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers, 20381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller TestStdinBadfiledescriptor] 20390c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 2040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None): 204518623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller if sys.platform.startswith("linux"): 204618623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller try: 204718623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller lock = multiprocessing.RLock() 204818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller except OSError: 2049bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!") 2050ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson 2051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if run is None: 2052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from test.test_support import run_unittest as run 2053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.get_temp_dir() # creates temp directory for use by all processes 2055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.get_logger().setLevel(LOG_LEVEL) 2057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2058146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool = multiprocessing.Pool(4) 2059146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool = multiprocessing.dummy.Pool(4) 2060146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.__init__() 2061146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.start() 2062146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool = ManagerMixin.manager.Pool(4) 2063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson testcases = ( 2065146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + 2066146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + 20670c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + 20680c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz testcases_other 2069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 2070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase 2072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) 207313623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # (ncoghlan): Whether or not sys.exc_clear is executed by the threading 207413623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # module during these tests is at least platform dependent and possibly 207514459d5b1b800854ef8f1bbadf019682a6413a32Nick Coghlan # non-deterministic on any given platform. So we don't mind if the listed 207613623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # warnings aren't actually raised. 207707627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna with test_support.check_py3k_warnings( 207813623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan (".+__(get|set)slice__ has been removed", DeprecationWarning), 207913623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan (r"sys.exc_clear\(\) not supported", DeprecationWarning), 208013623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan quiet=True): 208107627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna run(suite) 2082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2083146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool.terminate() 2084146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool.terminate() 2085146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool.terminate() 2086146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.shutdown() 2087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2088146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool 2089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main(): 2091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson test_main(unittest.TextTestRunner(verbosity=2).run) 2092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__': 2094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson main() 2095