1dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Unit tests for the multiprocessing package 3dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 4dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 5dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport unittest 6dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport Queue 7dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time 8dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys 9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os 10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc 11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal 12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array 13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket 14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random 15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging 16a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouimport errno 17faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerkimport test.script_helper 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 35f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natalifrom multiprocessing import util 36f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali 37f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natalitry: 38f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali from multiprocessing import reduction 39f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali HAS_REDUCTION = True 40f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Nataliexcept ImportError: 41f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali HAS_REDUCTION = False 42dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 43a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtintry: 44a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin from multiprocessing.sharedctypes import Value, copy 45a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin HAS_SHAREDCTYPES = True 46a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtinexcept ImportError: 47a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin HAS_SHAREDCTYPES = False 48a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin 49a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitroutry: 50a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou import msvcrt 51a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouexcept ImportError: 52a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou msvcrt = None 53a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 54dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 58e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str 59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants 62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 63dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 64dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING 65654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG 66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1 68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False # making true makes tests take a lot longer 69dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # and can sometimes cause some non-serious 70dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # failures because some calls block a bit 71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # longer than expected 72dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS: 73dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4 74dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse: 75dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1 76dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 77dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing, 78dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'HAVE_BROKEN_SEM_GETVALUE', False) 79dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 809a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32") 819a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 82a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitroutry: 83a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou MAXFD = os.sysconf("SC_OPEN_MAX") 84a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouexcept: 85a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou MAXFD = 256 86a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 8836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# Some tests require ctypes 8936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# 9036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 9136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunatry: 9213623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan from ctypes import Structure, c_int, c_double 9336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunaexcept ImportError: 9436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna Structure = object 9536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna c_int = c_double = None 9636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 976392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali 986392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natalidef check_enough_semaphores(): 996392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali """Check that the system supports enough semaphores to run the test.""" 1006392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali # minimum number of semaphores available according to POSIX 1016392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali nsems_min = 256 1026392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali try: 1036392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali nsems = os.sysconf("SC_SEM_NSEMS_MAX") 1046392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali except (AttributeError, ValueError): 1056392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali # sysconf not available or setting not available 1066392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali return 1076392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali if nsems == -1 or nsems >= nsems_min: 1086392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali return 1096392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali raise unittest.SkipTest("The OS doesn't support enough semaphores " 1106392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali "to run the test (required: %d)." % nsems_min) 1116392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali 1126392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali 11336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# 114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish 115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object): 118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self, func): 120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.func = func 121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = None 122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __call__(self, *args, **kwds): 124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = time.time() 125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.func(*args, **kwds) 127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson finally: 128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = time.time() - t 129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases 132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object): 135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'manager', 'threads') 137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertTimingAlmostEqual(self, a, b): 139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if CHECK_TIMINGS: 140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(a, b, 1) 141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertReturnsIfImplemented(self, value, func, *args): 143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = func(*args) 145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.assertEqual(value, res) 149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1504eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou # For the sanity of Windows users, rather than crashing or freezing in 1514eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou # multiple ways. 1524eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def __reduce__(self, *args): 1534eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou raise NotImplementedError("shouldn't try to pickle a test case") 1544eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou 1554eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou __reduce_ex__ = __reduce__ 1564eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou 157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore 159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self): 162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.get_value() 164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._Semaphore__value 167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._value 170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise NotImplementedError 172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases 175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase): 178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_current(self): 182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 1831f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest('test not appropriate for {}'.format(self.TYPE)) 184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 1865bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller authkey = current.authkey 187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(current.is_alive()) 1895bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertTrue(not current.daemon) 190b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti self.assertIsInstance(authkey, bytes) 191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(len(authkey) > 0) 1925bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.ident, os.getpid()) 1935bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.exitcode, None) 194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1954eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 1964eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test(cls, q, *args, **kwds): 1974eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou current = cls.current_process() 198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(args) 199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(kwds) 2005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(current.name) 2014eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou if cls.TYPE != 'threads': 2025bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(bytes(current.authkey)) 203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(current.pid) 204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_process(self): 206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue(1) 207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.Event() 208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args = (q, 1, 2) 209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson kwargs = {'hello':23, 'bye':2.54} 210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson name = 'SomeProcess' 211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test, args=args, kwargs=kwargs, name=name 213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 2145bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 2182623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.authkey, current.authkey) 2192623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.is_alive(), False) 2202623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.daemon, True) 221aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(self.active_children()) is list) 2235bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2272623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.exitcode, None) 2282623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.is_alive(), True) 229aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2312623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), args[1:]) 2322623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), kwargs) 2332623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), p.name) 234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 2352623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), current.authkey) 2362623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(q.get(), p.pid) 237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2402623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.exitcode, 0) 2412623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(p.is_alive(), False) 242aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2444eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 2454eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_terminate(cls): 246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(1000) 247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 2501f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest('test not appropriate for {}'.format(self.TYPE)) 251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_terminate) 2535bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), True) 257aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 2585bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.terminate() 261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(p.join) 263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(join(), None) 264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(join.elapsed, 0.0) 265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), False) 267aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2715bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller # XXX sometimes get p.exitcode == 0 on Windows ... 2725bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller #self.assertEqual(p.exitcode, -signal.SIGTERM) 273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_cpu_count(self): 275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = multiprocessing.cpu_count() 277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = 1 279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(cpus) is int) 280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(cpus >= 1) 281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_active_children(self): 283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(self.active_children()), list) 284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=time.sleep, args=(DELTA,)) 286aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2886f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 290aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 293aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2954eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 2964eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_recursion(cls, wconn, id): 297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from multiprocessing import forking 298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wconn.send(id) 299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(id) < 2: 300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(2): 3014eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou p = cls.Process( 3024eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou target=cls._test_recursion, args=(wconn, id+[i]) 303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_recursion(self): 308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, wconn = self.Pipe(duplex=False) 309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_recursion(wconn, []) 310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [] 313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson while rconn.poll(): 314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result.append(rconn.recv()) 315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [ 317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [], 318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0], 319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 0], 320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 1], 321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1], 322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 0], 323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 1] 324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, expected) 326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 3272182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk @classmethod 3282182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk def _test_sys_exit(cls, reason, testfn): 3292182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk sys.stderr = open(testfn, 'w') 3302182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk sys.exit(reason) 3312182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk 3322182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk def test_sys_exit(self): 3332182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk # See Issue 13854 3342182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk if self.TYPE == 'threads': 3351f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest('test not appropriate for {}'.format(self.TYPE)) 3362182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk 3372182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk testfn = test_support.TESTFN 3382182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk self.addCleanup(test_support.unlink, testfn) 3392182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk 3403f8376eaa258e6d39f7e2466ca214c26967eaa66Richard Oudkerk for reason, code in (([1, 2, 3], 1), ('ignore this', 1)): 3412182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p = self.Process(target=self._test_sys_exit, args=(reason, testfn)) 3422182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p.daemon = True 3432182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p.start() 3442182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p.join(5) 3452182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk self.assertEqual(p.exitcode, code) 3462182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk 3472182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk with open(testfn, 'r') as f: 3482182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk self.assertEqual(f.read().rstrip(), str(reason)) 3492182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk 3502182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk for reason in (True, False, 8): 3512182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p = self.Process(target=sys.exit, args=(reason,)) 3522182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p.daemon = True 3532182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p.start() 3542182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk p.join(5) 3552182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk self.assertEqual(p.exitcode, reason) 3562182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk 357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process): 362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self): 364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.Process.__init__(self) 365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn, self.parent_conn = multiprocessing.Pipe() 366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def run(self): 368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for s in iter(self.child_conn.recv, None): 370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.send(s.upper()) 371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def submit(self, s): 374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson assert type(s) is str 375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(s) 376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.parent_conn.recv() 377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def stop(self): 379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(None) 380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase): 384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_subclassing(self): 388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser = _UpperCaser() 3896f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea uppercaser.daemon = True 390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.start() 391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('hello'), 'HELLO') 392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('world'), 'WORLD') 393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.stop() 394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.join() 395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q): 401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'empty'): 402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.empty() 403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == 0 405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize): 407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'full'): 408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.full() 409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == maxsize 411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase): 414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 4164eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 4174eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_put(cls, queue, child_can_start, parent_can_continue): 418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(6): 420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.get() 421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_put(self): 424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson MAXSIZE = 6 425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue(maxsize=MAXSIZE) 426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_put, 431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 4335bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(1) 440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2, True) 441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3, True, None) 442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4, False) 443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5, False, None) 444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put_nowait(6) 445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # the values may be in buffer but not yet in pipe so sleep a bit 447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), True) 451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put = TimingWrapper(queue.put) 453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put_nowait = TimingWrapper(queue.put_nowait) 454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False) 456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, None) 459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put_nowait, 7) 462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put_nowait.elapsed, 0) 463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1) 465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1) 466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2) 468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3) 471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3) 472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 4814eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 4824eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_get(cls, queue, child_can_start, parent_can_continue): 483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 484da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #queue.put(1) 485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2) 486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3) 487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4) 488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5) 489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_get(self): 492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_get, 498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 5005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 511da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson # Hangs unexpectedly, remove for now 512da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #self.assertEqual(queue.get(), 1) 513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True, None), 2) 514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True), 3) 515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(timeout=1), 4) 516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get_nowait(), 5) 517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(queue.get) 521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get_nowait = TimingWrapper(queue.get_nowait) 522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False) 524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, None) 527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get_nowait) 530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get_nowait.elapsed, 0) 531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, True, TIMEOUT1) 533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, TIMEOUT2) 536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3) 539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3) 540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 5434eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 5444eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_fork(cls, queue): 545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10, 20): 546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # note that at this point the items may only be buffered, so the 548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process cannot shutdown until the feeder thread has finished 549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pushing items onto the pipe. 550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_fork(self): 552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Old versions of Queue would fail to create a new feeder 553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # thread for a forked process if the original process had its 554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # own feeder thread. This test checks that this no longer 555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # happens. 556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # put items on queue so that main process starts a feeder thread 560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait to make sure thread starts before we fork a new process 564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # fork process 567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_fork, args=(queue,)) 5686f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check that all expected items are in the queue 572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(20): 573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), i) 574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, queue.get, False) 575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_qsize(self): 579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue() 580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 5831f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest('qsize method not implemented') 584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(1) 585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(5) 587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 2) 588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 5934eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 5944eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_task_done(cls, q): 595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for obj in iter(q.get, None): 596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.task_done() 598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_task_done(self): 600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.JoinableQueue() 601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'): 60336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna self.skipTest("requires 'queue.task_done()' method") 604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson workers = [self.Process(target=self._test_task_done, args=(queue,)) 606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(4)] 607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 6096f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.join() 616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(None) 619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 623233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka def test_no_import_lock_contention(self): 624233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka with test_support.temp_cwd(): 625233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka module_name = 'imported_by_an_imported_module' 626233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka with open(module_name + '.py', 'w') as f: 627233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka f.write("""if 1: 628233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka import multiprocessing 629233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka 630233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka q = multiprocessing.Queue() 631233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka q.put('knock knock') 632233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka q.get(timeout=3) 633233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka q.close() 634233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka """) 635233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka 636233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka with test_support.DirsOnSysPath(os.getcwd()): 637233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka try: 638233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka __import__(module_name) 639233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka except Queue.Empty: 640233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka self.fail("Probable regression on import lock contention;" 641233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka " see Issue #22853") 642233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka 643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase): 648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_lock(self): 650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(False), False) 653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((ValueError, threading.ThreadError), lock.release) 655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rlock(self): 657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.RLock() 658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((AssertionError, RuntimeError), lock.release) 665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 66682eb5902ce169be81110c79662b772b904cd00fcJesse Noller def test_lock_context(self): 66782eb5902ce169be81110c79662b772b904cd00fcJesse Noller with self.Lock(): 66882eb5902ce169be81110c79662b772b904cd00fcJesse Noller pass 66982eb5902ce169be81110c79662b772b904cd00fcJesse Noller 670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase): 672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_semaphore(self, sem): 674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(False), False) 680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_semaphore(self): 687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(2) 688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(3, get_value, sem) 691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(4, get_value, sem) 693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_bounded_semaphore(self): 695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.BoundedSemaphore(2) 696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Currently fails on OS/X 698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #if HAVE_GETVALUE: 699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertRaises(ValueError, sem.release) 700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertReturnsIfImplemented(2, get_value, sem) 701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 7041f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest('test not appropriate for {}'.format(self.TYPE)) 705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(0) 707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson acquire = TimingWrapper(sem.acquire) 708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False), False) 710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, None), False) 713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, TIMEOUT1), False) 716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0) 717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(True, TIMEOUT2), False) 719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2) 720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(timeout=TIMEOUT3), False) 722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3) 723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase): 726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 7274eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 7284eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def f(cls, cond, sleeping, woken, timeout=None): 729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.release() 731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.wait(timeout) 732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.release() 733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def check_invariant(self, cond): 736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # this is only supposed to succeed when there are no sleepers 737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleepers = (cond._sleeping_count.get_value() - 740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond._woken_count.get_value()) 741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sleepers, 0) 742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(cond._wait_semaphore.get_value(), 0) 743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify(self): 747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 7525bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 7565bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for both children to start sleeping 760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up one process/thread 768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check one process/thread has woken up 773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, woken) 775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up another 777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check other has woken up 782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, woken) 784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify_all(self): 790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some threads/processes which will timeout 795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, 797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 7985bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, 802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 803a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them all to sleep 807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all timed out 811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.acquire() 813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some more threads/processes 819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 8215bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 825a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them to all sleep 829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake them all up 837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify_all() 839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all woken 842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(6, get_value, woken) 844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(cond.wait) 851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = wait(TIMEOUT1) 853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(res, None) 855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase): 859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8604eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 8614eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_event(cls, event): 862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(TIMEOUT2) 863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_event(self): 866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event = self.Event() 867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(event.wait) 868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 869c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti # Removed temporarily, due to API shear, this does not 870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # work with threading._Event objects. is_set == isSet 87102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), False) 872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 87302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # Removed, threading.Event.wait() will return the value of the __flag 87402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # instead of None. API Shear with the semaphore backed mp.Event 87502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(0.0), False) 876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 87702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), False) 878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # See note above on the API differences 88302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), True) 88402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 88602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), True) 887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertEqual(event.is_set(), True) 889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.clear() 891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #self.assertEqual(event.is_set(), False) 893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8946f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p = self.Process(target=self._test_event, args=(event,)) 8956f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 8966f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.start() 89702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase): 904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 90536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ALLOWED_TYPES = ('processes',) 90636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson codes_values = [ 908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('i', 4343, 24234), 909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('d', 3.625, -4.25), 910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('h', -232, 234), 911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('c', latin('x'), latin('y')) 912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 91455d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou def setUp(self): 91555d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou if not HAS_SHAREDCTYPES: 91655d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou self.skipTest("requires multiprocessing.sharedctypes") 91755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou 9184eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 9194eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test(cls, values): 9204eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou for sv, cv in zip(values, cls.codes_values): 921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sv.value = cv[2] 922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_value(self, raw=False): 925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.RawValue(code, value) 927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.Value(code, value) 930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[1]) 934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process(target=self._test, args=(values,)) 9366f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea proc.daemon = True 937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[2]) 942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawvalue(self): 944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_value(raw=True) 945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock(self): 947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val1 = self.Value('i', 5) 948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = val1.get_lock() 949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = val1.get_obj() 950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val2 = self.Value('i', 5, lock=None) 952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = val2.get_lock() 953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = val2.get_obj() 954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val3 = self.Value('i', 5, lock=lock) 957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = val3.get_lock() 958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = val3.get_obj() 959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 9616ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Value('i', 5, lock=False) 962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 9656ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue') 9666ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 9676ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawValue('i', 5) 9686ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 9696ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 9706ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase): 973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 97436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ALLOWED_TYPES = ('processes',) 97536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 9764eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 9774eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def f(cls, seq): 978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1, len(seq)): 979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq[i] += seq[i-1] 980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 98136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_array(self, raw=False): 983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831] 984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.RawArray('i', seq) 986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.Array('i', seq) 988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(len(arr), len(seq)) 990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(arr[3], seq[3]) 991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[2:7]), list(seq[2:7])) 992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4]) 994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.f(seq) 998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(arr,)) 10006f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 100636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 1007d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson def test_array_from_size(self): 1008d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson size = 10 1009d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson # Test for zeroing (see issue #11675). 1010d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson # The repetition below strengthens the test by increasing the chances 1011d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson # of previously allocated non-zero memory being used for the new array 1012d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson # on the 2nd and 3rd loops. 1013d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson for _ in range(3): 1014d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson arr = self.Array('i', size) 1015d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson self.assertEqual(len(arr), size) 1016d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson self.assertEqual(list(arr), [0] * size) 1017d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson arr[:] = range(10) 1018d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson self.assertEqual(list(arr), range(10)) 1019d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson del arr 1020d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson 1021d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson @unittest.skipIf(c_int is None, "requires _ctypes") 1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawarray(self): 1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_array(raw=True) 1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 102536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 1026f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson def test_array_accepts_long(self): 1027f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson arr = self.Array('i', 10L) 1028f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson self.assertEqual(len(arr), 10) 1029f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson raw_arr = self.RawArray('i', 10L) 1030f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson self.assertEqual(len(raw_arr), 10) 1031f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson 1032f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson @unittest.skipIf(c_int is None, "requires _ctypes") 1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock_obj(self): 1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr1 = self.Array('i', range(10)) 1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = arr1.get_lock() 1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = arr1.get_obj() 1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr2 = self.Array('i', range(10), lock=None) 1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = arr2.get_lock() 1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = arr2.get_obj() 1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr3 = self.Array('i', range(10), lock=lock) 1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = arr3.get_lock() 1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = arr3.get_obj() 1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 10486ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Array('i', range(10), lock=False) 1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 10516ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, 10526ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.Array, 'i', range(10), lock='notalock') 10536ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 10546ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawArray('i', range(10)) 10556ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 10566ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase): 1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_list(self): 1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = self.list(range(10)) 1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = self.list() 1071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], []) 1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1073dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b.extend(range(5)) 1074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], range(5)) 1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2], 2) 1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2:10], [2,3,4]) 1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b *= 2 1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) 1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6]) 1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = [a, b] 1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.list(d) 1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual( 1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e[:], 1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]] 1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson f = self.list([a]) 1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.append('hello') 1095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']]) 1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_dict(self): 1098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = self.dict() 1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson indices = range(65, 70) 1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in indices: 1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[i] = chr(i) 1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices)) 1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.keys()), indices) 1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.values()), [chr(i) for i in indices]) 1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices]) 1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_namespace(self): 1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n = self.Namespace() 1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.name = 'Bob' 1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.job = 'Builder' 1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n._hidden = 'hidden' 1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual((n.name, n.job), ('Bob', 'Builder')) 1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del n.job 1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(str(n), "Namespace(name='Bob')") 1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(hasattr(n, 'name')) 1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(not hasattr(n, 'job')) 1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0): 1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(wait) 1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return x*x 11257c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 11267c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchakaclass SayWhenError(ValueError): pass 11277c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 11287c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchakadef exception_throwing_generator(total, when): 11297c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka for i in range(total): 11307c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka if i == when: 11317c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka raise SayWhenError("Somebody said when") 11327c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka yield i 11337c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase): 1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_apply(self): 1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson papply = self.pool.apply 1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (5,)), sqr(5)) 1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3)) 1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_map(self): 1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pmap = self.pool.map 1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10))) 1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(100), chunksize=20), 1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson map(sqr, range(100))) 1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 114721aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk def test_map_unplicklable(self): 114821aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk # Issue #19425 -- failure to pickle should not cause a hang 114921aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk if self.TYPE == 'threads': 11501f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest('test not appropriate for {}'.format(self.TYPE)) 115121aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk class A(object): 115221aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk def __reduce__(self): 115321aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk raise RuntimeError('cannot pickle') 115421aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk with self.assertRaises(RuntimeError): 115521aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk self.pool.map(sqr, [A()]*10) 115621aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk 11577530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller def test_map_chunksize(self): 11587530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller try: 11597530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1) 11607530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller except multiprocessing.TimeoutError: 11617530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.fail("pool.map_async with chunksize stalled on null list") 11627530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller 1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async(self): 1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) 1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(get(), 49) 1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async_timeout(self): 117065162a7ccacb12801121fa7369fd0d406e8c6f64Richard Oudkerk res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 1.0)) 1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2) 1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2) 1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap(self): 1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(it), map(sqr, range(10))) 1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(1000), chunksize=100) 1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1000): 1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 11897c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka def test_imap_handle_iterable_exception(self): 11907c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka if self.TYPE == 'manager': 11917c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.skipTest('test not appropriate for {}'.format(self.TYPE)) 11927c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 11937c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka it = self.pool.imap(sqr, exception_throwing_generator(10, 3), 1) 11947c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka for i in range(3): 11957c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.assertEqual(next(it), i*i) 11967c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.assertRaises(SayWhenError, it.next) 11977c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 11987c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka # SayWhenError seen at start of problematic chunk's results 11997c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka it = self.pool.imap(sqr, exception_throwing_generator(20, 7), 2) 12007c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka for i in range(6): 12017c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.assertEqual(next(it), i*i) 12027c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.assertRaises(SayWhenError, it.next) 12037c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka it = self.pool.imap(sqr, exception_throwing_generator(20, 7), 4) 12047c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka for i in range(4): 12057c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.assertEqual(next(it), i*i) 12067c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.assertRaises(SayWhenError, it.next) 12077c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap_unordered(self): 1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000)) 1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000), chunksize=53) 1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 12157c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka def test_imap_unordered_handle_iterable_exception(self): 12167c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka if self.TYPE == 'manager': 12177c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka self.skipTest('test not appropriate for {}'.format(self.TYPE)) 12187c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 12197c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka it = self.pool.imap_unordered(sqr, 12207c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka exception_throwing_generator(10, 3), 12217c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 1) 122289c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka expected_values = map(sqr, range(10)) 12237c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka with self.assertRaises(SayWhenError): 12247c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka # imap_unordered makes it difficult to anticipate the SayWhenError 12257c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka for i in range(10): 122689c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka value = next(it) 122789c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka self.assertIn(value, expected_values) 122889c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka expected_values.remove(value) 12297c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 12307c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka it = self.pool.imap_unordered(sqr, 12317c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka exception_throwing_generator(20, 7), 12327c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 2) 123389c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka expected_values = map(sqr, range(20)) 12347c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka with self.assertRaises(SayWhenError): 12357c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka for i in range(20): 123689c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka value = next(it) 123789c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka self.assertIn(value, expected_values) 123889c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka expected_values.remove(value) 12397c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka 1240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_make_pool(self): 1241f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner self.assertRaises(ValueError, multiprocessing.Pool, -1) 1242f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner self.assertRaises(ValueError, multiprocessing.Pool, 0) 1243f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner 1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = multiprocessing.Pool(3) 1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(3, len(p._pool)) 1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.close() 1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 12506d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk p = self.Pool(4) 12516d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk result = p.map_async( 1252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep, [0.1 for i in range(10000)], chunksize=1 1253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 12546d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk p.terminate() 12556d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk join = TimingWrapper(p.join) 1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join() 1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(join.elapsed < 0.2) 1258654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1259d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk def test_empty_iterable(self): 1260d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk # See Issue 12157 1261d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk p = self.Pool(1) 1262d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk 1263d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk self.assertEqual(p.map(sqr, []), []) 1264d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk self.assertEqual(list(p.imap(sqr, [])), []) 1265d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk self.assertEqual(list(p.imap_unordered(sqr, [])), []) 1266d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk self.assertEqual(p.map_async(sqr, []).get(), []) 1267d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk 1268d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk p.close() 1269d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk p.join() 1270d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk 12710c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerkdef unpickleable_result(): 12720c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk return lambda: 42 12730c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk 12740c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerkclass _TestPoolWorkerErrors(BaseTestCase): 12750c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk ALLOWED_TYPES = ('processes', ) 12760c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk 12770c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk def test_unpickleable_result(self): 12780c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk from multiprocessing.pool import MaybeEncodingError 12790c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk p = multiprocessing.Pool(2) 12800c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk 12810c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk # Make sure we don't lose pool processes because of encoding errors. 12820c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk for iteration in range(20): 12830c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk res = p.apply_async(unpickleable_result) 12840c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk self.assertRaises(MaybeEncodingError, res.get) 12850c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk 12860c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk p.close() 12870c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk p.join() 12880c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk 1289654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase): 1290654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1291654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller ALLOWED_TYPES = ('processes', ) 1292654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller def test_pool_worker_lifetime(self): 1293654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p = multiprocessing.Pool(3, maxtasksperchild=10) 1294654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(3, len(p._pool)) 1295654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller origworkerpids = [w.pid for w in p._pool] 1296654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Run many tasks so each worker gets replaced (hopefully) 1297654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results = [] 1298654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for i in range(100): 1299654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results.append(p.apply_async(sqr, (i, ))) 1300654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Fetch the results and verify we got the right answers, 1301654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # also ensuring all the tasks have completed. 1302654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for (j, res) in enumerate(results): 1303654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(res.get(), sqr(j)) 1304654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Refill the pool 1305654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p._repopulate_pool() 13063bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # Wait until all workers are alive 1307c2b0d76bf3387cd4841acde40f232051d4ddf23fAntoine Pitrou # (countdown * DELTA = 5 seconds max startup process time) 1308c2b0d76bf3387cd4841acde40f232051d4ddf23fAntoine Pitrou countdown = 50 13093bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna while countdown and not all(w.is_alive() for w in p._pool): 13103bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna countdown -= 1 13113bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna time.sleep(DELTA) 1312654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller finalworkerpids = [w.pid for w in p._pool] 13133bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # All pids should be assigned. See issue #7805. 13143bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna self.assertNotIn(None, origworkerpids) 13153bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna self.assertNotIn(None, finalworkerpids) 13163bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # Finally, check that the worker pids have changed 1317654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids)) 1318654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.close() 1319654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.join() 1320654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 132146f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali def test_pool_worker_lifetime_early_close(self): 132246f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali # Issue #10332: closing a pool whose workers have limited lifetimes 132346f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali # before all the tasks completed would make join() hang. 132446f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali p = multiprocessing.Pool(3, maxtasksperchild=1) 132546f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali results = [] 132646f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali for i in range(6): 132746f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali results.append(p.apply_async(sqr, (i, 0.3))) 132846f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali p.close() 132946f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali p.join() 133046f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali # check the results 133146f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali for (j, res) in enumerate(results): 133246f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali self.assertEqual(res.get(), sqr(j)) 133346f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali 133446f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali 1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left 1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase): 1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because test cases are sorted alphabetically, this one will get 1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # run after all the other tests for the manager. It tests that 1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # there have been no "reference leaks" for the manager's shared 1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # objects. Note the comment in _TestPool.test_terminate(). 1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_number_of_objects(self): 1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson EXPECTED_NUMBER = 1 # the pool object is still alive 1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.active_children() # discard dead process objs 1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson gc.collect() # do garbage collection 1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson refs = self.manager._number_of_objects() 13517314b38168da53863136d1937059fc0ac4883a56Jesse Noller debug_info = self.manager._debug_info() 1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if refs != EXPECTED_NUMBER: 13537fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller print self.manager._debug_info() 13547314b38168da53863136d1937059fc0ac4883a56Jesse Noller print debug_info 1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(refs, EXPECTED_NUMBER) 1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class 1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError 1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object): 1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self): 1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 'f()' 1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def g(self): 1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise ValueError 1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _h(self): 1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return '_h()' 1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz(): 1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson yield i*i 1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy): 1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _exposed_ = ('next', '__next__') 1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __iter__(self): 1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self 1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def next(self): 1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('next') 1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __next__(self): 1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('__next__') 1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager): 1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar) 1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h')) 1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy) 1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase): 1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_mymanager(self): 1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = MyManager() 1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = manager.Foo() 1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = manager.Bar() 1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson baz = manager.baz() 1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)] 1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)] 1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo_methods, ['f', 'g']) 1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar_methods, ['f', '_h']) 1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.f(), 'f()') 1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, foo.g) 1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo._callmethod('f'), 'f()') 1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(RemoteError, foo._callmethod, '_h') 1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.f(), 'f()') 1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._h(), '_h()') 1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('f'), 'f()') 1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('_h'), '_h()') 1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(baz), [i*i for i in range(10)]) 1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization 1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue() 1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue(): 1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return _queue 1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager): 1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class used by server process''' 1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue) 1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager): 1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class which specifies the same interface as QueueManager''' 1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue') 1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib' 1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase): 1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 14477fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka values = ['hello world', None, True, 2.25, 14487fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka #'hall\xc3\xa5 v\xc3\xa4rlden'] # UTF-8 14497fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka ] 14507fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka result = values[:] 14517fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka if test_support.have_unicode: 14527fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka #result[-1] = u'hall\xe5 v\xe4rlden' 14537fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka uvalue = test_support.u(r'\u043f\u0440\u0438\u0432\u0456\u0442 ' 14547fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka r'\u0441\u0432\u0456\u0442') 14557fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka values.append(uvalue) 14567fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka result.append(uvalue) 1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 14584eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 14594eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _putter(cls, address, authkey): 1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager2( 1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=address, authkey=authkey, serializer=SERIALIZER 1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.connect() 1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager.get_queue() 14657fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka # Note that xmlrpclib will deserialize object as a list not a tuple 14667fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka queue.put(tuple(cls.values)) 1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_remote(self): 1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson authkey = os.urandom(32) 1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager( 147278254dc6fc71d28f70c52dd70c0bc3e14ae7d0c2Antoine Pitrou address=(test.test_support.HOST, 0), authkey=authkey, serializer=SERIALIZER 1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._putter, args=(manager.address, authkey)) 14776f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2 = QueueManager2( 1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=manager.address, authkey=authkey, serializer=SERIALIZER 1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2.connect() 1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager2.get_queue() 1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 14867fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka self.assertEqual(queue.get(), self.result) 1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because we are using xmlrpclib for serialization instead of 1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pickle this will cause a serialization error. 1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Exception, queue.put, time.sleep) 1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Make queue finalizer run before the server is stopped 1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del queue 1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1496459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase): 1497459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 14984eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 14994eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _putter(cls, address, authkey): 1500459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1501459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=address, authkey=authkey, serializer=SERIALIZER) 1502459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.connect() 1503459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1504459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue.put('hello world') 1505459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1506459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def test_rapid_restart(self): 1507459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller authkey = os.urandom(32) 1508459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 150978254dc6fc71d28f70c52dd70c0bc3e14ae7d0c2Antoine Pitrou address=(test.test_support.HOST, 0), authkey=authkey, serializer=SERIALIZER) 151087d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin srvr = manager.get_server() 151187d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin addr = srvr.address 151287d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin # Close the connection.Listener socket which gets opened as a part 151387d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin # of manager.get_server(). It's not needed for the test. 151487d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin srvr.listener.close() 1515459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1516459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1517459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p = self.Process(target=self._putter, args=(manager.address, authkey)) 15186f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 1519459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p.start() 1520459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1521459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller self.assertEqual(queue.get(), 'hello world') 1522019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller del queue 1523459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.shutdown() 1524459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 152554f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou address=addr, authkey=authkey, serializer=SERIALIZER) 1526459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1527019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller manager.shutdown() 1528459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('') 1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase): 1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 15394eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 15404eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _echo(cls, conn): 1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for msg in iter(conn.recv_bytes, SENTINEL): 1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_connection(self): 1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 15495bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [1, 2.25, None] 1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello world') 1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson longmsg = msg * 10 1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = array.array('i', range(4)) 1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(conn.fileno()), int) 1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send(seq), None) 1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), seq) 1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(msg), None) 1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = list(arr) + [0] * (10 - len(arr)) 1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer), 1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr)) 1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize), 1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = bytearray(latin(' ' * 40)) 1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(longmsg), None) 1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = conn.recv_bytes_into(buffer) 1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except multiprocessing.BufferTooShort, e: 1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(e.args, (longmsg,)) 1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.fail('expected BufferTooShort, got %s' % res) 1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson poll = TimingWrapper(conn.poll) 1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(), False) 1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), False) 1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) 1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(None) 1599cef2006eaff86f843b8f0fc21fc7b652415b96edGiampaolo Rodola' time.sleep(.1) 1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), True) 1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), None) 1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson really_big_msg = latin('X') * (1024 * 1024 * 16) # 16Mb 1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(really_big_msg) 1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), really_big_msg) 1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) # tell child to quit 1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() 1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.readable, True) 1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.writable, True) 1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv) 1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv_bytes) 1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_duplex_false(self): 1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = self.Pipe(duplex=False) 1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.send(1), None) 1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.recv(), 1) 1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.readable, True) 1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.writable, False) 1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.readable, False) 1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.writable, True) 1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, reader.send, 2) 1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.recv) 1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.poll) 1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_spawn_close(self): 1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # We test that a pipe connection can be closed by parent 1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process immediately after child is spawned. On Windows this 1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # would have sometimes failed on old versions because 1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # child_conn would be closed before the child got a chance to 1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # duplicate it. 1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 16436f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() # this might complete before child initializes 1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello') 1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) 1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sendbytes(self): 1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 16571f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest('test not appropriate for {}'.format(self.TYPE)) 1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('abcdefghijklmnopqrstuvwxyz') 1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a, b = self.Pipe() 1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg) 1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg) 1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 5) 1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[5:]) 1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 7, 8) 1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[7:7+8]) 1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26) 1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26, 0) 1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 27) 1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 22, 5) 1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 26, 1) 1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, -1) 1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) 1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1687a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou @classmethod 1688a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou def _is_fd_assigned(cls, fd): 1689a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou try: 1690a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou os.fstat(fd) 1691a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou except OSError as e: 1692a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if e.errno == errno.EBADF: 1693a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou return False 1694a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou raise 1695a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou else: 1696a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou return True 1697a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 1698a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou @classmethod 1699a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou def _writefd(cls, conn, data, create_dummy_fds=False): 1700a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if create_dummy_fds: 1701a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou for i in range(0, 256): 1702a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if not cls._is_fd_assigned(i): 1703a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou os.dup2(conn.fileno(), i) 1704a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou fd = reduction.recv_handle(conn) 1705a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if msvcrt: 1706a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou fd = msvcrt.open_osfhandle(fd, os.O_WRONLY) 1707a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou os.write(fd, data) 1708a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou os.close(fd) 1709a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 1710f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") 1711a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou def test_fd_transfer(self): 1712a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if self.TYPE != 'processes': 1713a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou self.skipTest("only makes sense with processes") 1714a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou conn, child_conn = self.Pipe(duplex=True) 1715a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 1716a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou p = self.Process(target=self._writefd, args=(child_conn, b"foo")) 17176f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 1718a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou p.start() 1719a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou with open(test_support.TESTFN, "wb") as f: 1720a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou fd = f.fileno() 1721a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if msvcrt: 1722a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou fd = msvcrt.get_osfhandle(fd) 1723a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou reduction.send_handle(conn, fd, p.pid) 1724a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou p.join() 1725a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou with open(test_support.TESTFN, "rb") as f: 1726a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou self.assertEqual(f.read(), b"foo") 1727a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 1728f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") 1729a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou @unittest.skipIf(sys.platform == "win32", 1730a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou "test semantics don't make sense on Windows") 1731a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou @unittest.skipIf(MAXFD <= 256, 1732a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou "largest assignable fd number is too small") 1733a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou @unittest.skipUnless(hasattr(os, "dup2"), 1734a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou "test needs os.dup2()") 1735a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou def test_large_fd_transfer(self): 1736a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou # With fd > 256 (issue #11657) 1737a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if self.TYPE != 'processes': 1738a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou self.skipTest("only makes sense with processes") 1739a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou conn, child_conn = self.Pipe(duplex=True) 1740a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 1741a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou p = self.Process(target=self._writefd, args=(child_conn, b"bar", True)) 17426f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 1743a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou p.start() 1744a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou with open(test_support.TESTFN, "wb") as f: 1745a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou fd = f.fileno() 1746a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou for newfd in range(256, MAXFD): 1747a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou if not self._is_fd_assigned(newfd): 1748a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou break 1749a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou else: 1750a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou self.fail("could not find an unassigned large file descriptor") 1751a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou os.dup2(fd, newfd) 1752a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou try: 1753a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou reduction.send_handle(conn, newfd, p.pid) 1754a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou finally: 1755a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou os.close(newfd) 1756a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou p.join() 1757a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou with open(test_support.TESTFN, "rb") as f: 1758a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou self.assertEqual(f.read(), b"bar") 1759a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 1760c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea @classmethod 1761c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea def _send_data_without_fd(self, conn): 1762c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea os.write(conn.fileno(), b"\0") 1763c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea 1764f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") 1765c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea @unittest.skipIf(sys.platform == "win32", "doesn't make sense on Windows") 1766c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea def test_missing_fd_transfer(self): 1767c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea # Check that exception is raised when received data is not 1768c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea # accompanied by a file descriptor in ancillary data. 1769c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea if self.TYPE != 'processes': 1770c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea self.skipTest("only makes sense with processes") 1771c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea conn, child_conn = self.Pipe(duplex=True) 1772c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea 1773c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea p = self.Process(target=self._send_data_without_fd, args=(child_conn,)) 1774c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea p.daemon = True 1775c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea p.start() 1776c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea self.assertRaises(RuntimeError, reduction.recv_handle, conn) 1777c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea p.join() 1778a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou 1779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase): 1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 17834eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 17844eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test(cls, address): 17854eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou conn = cls.connection.Client(address) 1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send('hello') 1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_listener_client(self): 1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for family in self.connection.families: 1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=family) 1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test, args=(l.address,)) 17935bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = l.accept() 1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), 'hello') 1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.close() 17999a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk 18009a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk def test_issue14725(self): 18019a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk l = self.connection.Listener() 18029a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk p = self.Process(target=self._test, args=(l.address,)) 18039a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk p.daemon = True 18049a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk p.start() 18059a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk time.sleep(1) 18069a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk # On Windows the client process should by now have connected, 18079a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk # written data and closed the pipe handle by now. This causes 18089a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk # ConnectNamdedPipe() to fail with ERROR_NO_DATA. See Issue 18099a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk # 14725. 18109a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk conn = l.accept() 18119a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk self.assertEqual(conn.recv(), 'hello') 18129a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk conn.close() 18139a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk p.join() 18149a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk l.close() 18159a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk 1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes 1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1819da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase): 1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _listener(self, conn, families): 1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=fam) 1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.address) 1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = l.accept() 1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = socket.socket() 1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.bind(('localhost', 0)) 1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.getsockname()) 1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.listen(1) 1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn, addr = l.accept() 1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.recv() 1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _remote(self, conn): 1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for (address, msg) in iter(conn.recv, None): 1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = self.connection.Client(address) 1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.send(msg.upper()) 1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address, msg = conn.recv() 1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = socket.socket() 1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.connect(address) 1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.sendall(msg.upper()) 1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_pickling(self): 1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.allow_connection_pickling() 1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except ImportError: 1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson families = self.connection.families 1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn, lconn0 = self.Pipe() 1865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp = self.Process(target=self._listener, args=(lconn0, families)) 18666f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea lp.daemon = True 1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.start() 1868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn0.close() 1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, rconn0 = self.Pipe() 1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp = self.Process(target=self._remote, args=(rconn0,)) 18726f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea rp.daemon = True 1873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.start() 1874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn0.close() 1875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = ('This connection uses family %s' % fam).encode('ascii') 1878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(), msg.upper()) 1882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send(None) 1884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('This connection uses a normal socket') 1887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(socket, 'fromfd'): 1890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(100), msg.upper()) 1892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # XXX On Windows with Py2.6 need to backport fromfd() 1894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson discard = lconn.recv_bytes() 1895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.send(None) 1897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.close() 1899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.close() 1900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.join() 1902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.join() 1903da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase): 1909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_heap(self): 1913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson iterations = 5000 1914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson maxblocks = 50 1915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks = [] 1916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # create and destroy lots of blocks of different sizes 1918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(iterations): 1919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson size = int(random.lognormvariate(0, 1) * 1000) 1920dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = multiprocessing.heap.BufferWrapper(size) 1921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks.append(b) 1922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(blocks) > maxblocks: 1923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson i = random.randrange(maxblocks) 1924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del blocks[i] 1925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # get the heap object 1927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson heap = multiprocessing.heap.BufferWrapper._heap 1928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # verify the state of the heap 1930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all = [] 1931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied = 0 1932414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali heap._lock.acquire() 1933414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali self.addCleanup(heap._lock.release) 1934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for L in heap._len_to_seq.values(): 1935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in L: 1936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'free')) 1938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in heap._allocated_blocks: 1939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'occupied')) 1941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied += (stop-start) 1942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.sort() 1944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(all)-1): 1946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (arena, start, stop) = all[i][:3] 1947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (narena, nstart, nstop) = all[i+1][:3] 1948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue((arena != narena and nstart == 0) or 1949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (stop == nstart)) 1950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1951414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali def test_free_from_gc(self): 1952414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # Check that freeing of blocks by the garbage collector doesn't deadlock 1953414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # (issue #12352). 1954414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # Make sure the GC is enabled, and set lower collection thresholds to 1955414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # make collections more frequent (and increase the probability of 1956414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # deadlock). 19577c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali if not gc.isenabled(): 1958414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali gc.enable() 1959414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali self.addCleanup(gc.disable) 19607c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali thresholds = gc.get_threshold() 19617c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali self.addCleanup(gc.set_threshold, *thresholds) 1962414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali gc.set_threshold(10) 1963414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali 1964414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # perform numerous block allocations, with cyclic references to make 1965414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # sure objects are collected asynchronously by the gc 1966414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali for i in range(5000): 1967414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali a = multiprocessing.heap.BufferWrapper(1) 1968414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali b = multiprocessing.heap.BufferWrapper(1) 1969414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali # circular references 1970414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali a.buddy = b 1971414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali b.buddy = a 1972414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali 1973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure): 1978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _fields_ = [ 1979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('x', c_int), 1980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('y', c_double) 1981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 1982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase): 1984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 198755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou def setUp(self): 198855d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou if not HAS_SHAREDCTYPES: 198955d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou self.skipTest("requires multiprocessing.sharedctypes") 199055d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou 19914eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 19924eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _double(cls, x, y, foo, arr, string): 1993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x.value *= 2 1994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y.value *= 2 1995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x *= 2 1996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y *= 2 1997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value *= 2 1998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(arr)): 1999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[i] *= 2 2000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sharedctypes(self, lock=False): 2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x = Value('i', 7, lock=lock) 2003bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl y = Value(c_double, 1.0/3.0, lock=lock) 2004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = Value(_Foo, 3, 2, lock=lock) 2005bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl arr = self.Array('d', range(10), lock=lock) 2006bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl string = self.Array('c', 20, lock=lock) 2007a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin string.value = latin('hello') 2008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._double, args=(x, y, foo, arr, string)) 20106f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 2011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 2012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 2013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(x.value, 14) 2015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(y.value, 2.0/3.0) 2016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.x, 6) 2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(foo.y, 4.0) 2018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 2019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(arr[i], i*2) 2020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(string.value, latin('hellohello')) 2021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_synchronize(self): 2023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_sharedctypes(lock=True) 2024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_copy(self): 2026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = _Foo(2, 5.0) 2027a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin bar = copy(foo) 2028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x = 0 2029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y = 0 2030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.x, 2) 2031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(bar.y, 5.0) 2032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase): 2038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 2040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 20414eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 20424eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_finalize(cls, conn): 2043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Foo(object): 2044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 2045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = Foo() 2047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(a, conn.send, args=('a',)) 2048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del a # triggers callback for a 2049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = Foo() 2051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b = util.Finalize(b, conn.send, args=('b',)) 2052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # triggers callback for b 2053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # does nothing because callback has already been called 2054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del b # does nothing because callback has already been called 2055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c = Foo() 2057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(c, conn.send, args=('c',)) 2058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d10 = Foo() 2060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d10, conn.send, args=('d10',), exitpriority=1) 2061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d01 = Foo() 2063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d01, conn.send, args=('d01',), exitpriority=0) 2064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d02 = Foo() 2065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d02, conn.send, args=('d02',), exitpriority=0) 2066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d03 = Foo() 2067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d03, conn.send, args=('d03',), exitpriority=0) 2068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('e',), exitpriority=-10) 2070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100) 2072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2073c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti # call multiprocessing's cleanup function then exit process without 2074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # garbage collecting locals 2075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util._exit_function() 2076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 2077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson os._exit(0) 2078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_finalize(self): 2080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 2081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_finalize, args=(child_conn,)) 20836f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 2084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 2085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 2086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [obj for obj in iter(conn.recv, 'STOP')] 2088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) 2089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module 2092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase): 2095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 2097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_import(self): 209936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna modules = [ 2100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing', 'multiprocessing.connection', 2101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.heap', 'multiprocessing.managers', 2102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.pool', 'multiprocessing.process', 2103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.synchronize', 'multiprocessing.util' 210436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ] 210536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 2106f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali if HAS_REDUCTION: 2107f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali modules.append('multiprocessing.reduction') 2108f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali 210936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna if c_int is not None: 211036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna # This module requires _ctypes 211136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna modules.append('multiprocessing.sharedctypes') 2112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in modules: 2114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson __import__(name) 2115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson mod = sys.modules[name] 2116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for attr in getattr(mod, '__all__', ()): 2118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue( 2119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson hasattr(mod, attr), 2120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '%r does not have attribute %r' % (mod, attr) 2121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 2122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output 2125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase): 2128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 2130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_enable_logging(self): 2132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 2133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(util.SUBWARNING) 2134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(logger is not None) 2135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.debug('this will not be printed') 2136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.info('nor will this') 2137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LOG_LEVEL) 2138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 21394eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou @classmethod 21404eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou def _test_level(cls, conn): 2141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 2142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(logger.getEffectiveLevel()) 2143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_level(self): 2145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL1 = 32 2146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL2 = 37 2147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 2149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger = logging.getLogger() 2150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_level = root_logger.level 2151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = multiprocessing.Pipe(duplex=False) 2153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LEVEL1) 21556f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p = self.Process(target=self._test_level, args=(writer,)) 21566f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 21576f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.start() 2158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL1, reader.recv()) 2159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(logging.NOTSET) 2161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(LEVEL2) 21626f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p = self.Process(target=self._test_level, args=(writer,)) 21636f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.daemon = True 21646f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea p.start() 2165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL2, reader.recv()) 2166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(root_level) 2168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(level=LOG_LEVEL) 2169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2170814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 21719a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase): 21729a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 21739a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def handle(self, record): 21749a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert record.processName == multiprocessing.current_process().name 21759a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = True 21769a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 21779a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def test_logging(self): 21789a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler = logging.Handler() 21799a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler.handle = self.handle 21809a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = False 21819a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# # Bypass getLogger() and side-effects 21829a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger = logging.getLoggerClass()( 21839a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 'multiprocessing.test.TestLoggingProcessName') 21849a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.addHandler(handler) 21859a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.propagate = False 21869a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 21879a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.warn('foo') 21889a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert self.__handled 2189814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 2190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2191ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk# Check that Process.join() retries if os.waitpid() fails with EINTR 2192ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk# 2193ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk 2194ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerkclass _TestPollEintr(BaseTestCase): 2195ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk 2196ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk ALLOWED_TYPES = ('processes',) 2197ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk 2198ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk @classmethod 2199ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk def _killer(cls, pid): 2200ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk time.sleep(0.5) 2201ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk os.kill(pid, signal.SIGUSR1) 2202ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk 2203ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk @unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1') 2204ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk def test_poll_eintr(self): 2205ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk got_signal = [False] 2206ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk def record(*args): 2207ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk got_signal[0] = True 2208ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk pid = os.getpid() 2209ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk oldhandler = signal.signal(signal.SIGUSR1, record) 2210ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk try: 2211ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk killer = self.Process(target=self._killer, args=(pid,)) 2212ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk killer.start() 2213ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk p = self.Process(target=time.sleep, args=(1,)) 2214ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk p.start() 2215ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk p.join() 2216ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk self.assertTrue(got_signal[0]) 2217ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk self.assertEqual(p.exitcode, 0) 2218ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk killer.join() 2219ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk finally: 2220ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk signal.signal(signal.SIGUSR1, oldhandler) 2221ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk 2222ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk# 22239a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321 22249a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 22259a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 22269a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase): 22279a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 222836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(WIN32, "skipped on Windows") 22299a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller def test_invalid_handles(self): 22309a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller conn = _multiprocessing.Connection(44977608) 22319a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, conn.poll) 22329a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, _multiprocessing.Connection, -1) 223336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 22349a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 2235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module 2236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names): 2239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = {} 2240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in names: 2241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = getattr(Source, name) 2242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type(obj) == type(get_attributes): 2243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = staticmethod(obj) 2244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[name] = obj 2245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return d 2246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type): 2248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = {} 2249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson glob = globals() 225036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna Type = type.capitalize() 2251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in glob.keys(): 2253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if name.startswith('_Test'): 2254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson base = glob[name] 2255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type in base.ALLOWED_TYPES: 2256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson newname = 'With' + Type + name[1:] 2257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Temp(base, unittest.TestCase, Mixin): 2258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 2259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result[newname] = Temp 2260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__name__ = newname 2261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__module__ = Mixin.__module__ 2262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return result 2263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases 2266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object): 2269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'processes' 2270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 2271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing, ( 2272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 2273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'RawValue', 2274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'RawArray', 'current_process', 'active_children', 'Pipe', 2275d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk 'connection', 'JoinableQueue', 'Pool' 2276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 2277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes') 2279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes) 2280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object): 2283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'manager' 2284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 2285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = object.__new__(multiprocessing.managers.SyncManager) 2286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(manager, ( 2287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 2288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 2289d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk 'Namespace', 'JoinableQueue', 'Pool' 2290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 2291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager') 2293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager) 2294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object): 2297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'threads' 2298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.dummy.Process 2299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing.dummy, ( 2300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 2301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'current_process', 2302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'active_children', 'Pipe', 'connection', 'dict', 'list', 2303d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk 'Namespace', 'JoinableQueue', 'Pool' 2304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 2305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads') 2307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads) 2308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 23090c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase): 23100c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz # TODO: add more tests for deliver/answer challenge. 23110c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_deliver_challenge_auth_failure(self): 23120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 23130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 23142a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 23150c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 23160c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 23170c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 23180c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.deliver_challenge, 23190c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 23200c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 23210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_answer_challenge_auth_failure(self): 23220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 23230c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def __init__(self): 23240c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count = 0 23250c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 23260c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count += 1 23270c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz if self.count == 1: 23280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz return multiprocessing.connection.CHALLENGE 23290c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz elif self.count == 2: 23302a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 23312a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'' 23320c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 23330c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 23340c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 23350c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.answer_challenge, 23360c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 23370c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 23387152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 23397152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585 23407152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 23417152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 23427152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns): 23437152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller ns.test += 1 23447152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 23457152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase): 23467152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def setUp(self): 23477152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr = multiprocessing.Manager() 23487152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns = self.mgr.Namespace() 23497152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns.test = 0 23507152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 23517152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def tearDown(self): 23527152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr.shutdown() 23537152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 23547152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_manager_initializer(self): 23557152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m = multiprocessing.managers.SyncManager() 23567152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, m.start, 1) 23577152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.start(initializer, (self.ns,)) 23587152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 23597152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.shutdown() 23607152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 23617152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_pool_initializer(self): 23627152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, multiprocessing.Pool, initializer=1) 23637152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p = multiprocessing.Pool(1, initializer, (self.ns,)) 23647152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.close() 23657152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.join() 23667152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 23677152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 23681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 23691b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes 23701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior 23711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 23721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 2373c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerkdef _this_sub_process(q): 23741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller try: 23751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller item = q.get(block=False) 23761b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller except Queue.Empty: 23771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pass 23781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 2379c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerkdef _test_process(q): 2380c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk queue = multiprocessing.Queue() 2381c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk subProc = multiprocessing.Process(target=_this_sub_process, args=(queue,)) 2382c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk subProc.daemon = True 2383c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk subProc.start() 2384c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk subProc.join() 2385c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk 23861b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x): 23871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return x*x 23881b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 23891b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process(): 23901b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pool = multiprocessing.Pool(processes=4) 23911b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7]) 23921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 23931b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object): 23941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def __init__(self, delegate): 23951b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate = delegate 23961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = None 23971b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 23981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller @property 23991b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def cache(self): 24001b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pid = os.getpid() 24011b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller # There are no race conditions since fork keeps only the running thread 24021b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller if pid != self._pid: 24031b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = pid 24041b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 24051b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return self._cache 24061b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 24071b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def write(self, data): 24081b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self.cache.append(data) 24091b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 24101b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def flush(self): 24111b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate.write(''.join(self.cache)) 24121b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 24131b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 24141b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase): 24151b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 24161b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_queue_in_process(self): 24171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 2418c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk proc = multiprocessing.Process(target=_test_process, args=(queue,)) 24191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.start() 24201b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.join() 24211b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 24221b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_pool_in_process(self): 24231b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p = multiprocessing.Process(target=pool_in_process) 24241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.start() 24251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.join() 24261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 24271b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_flushing(self): 24281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller sio = StringIO() 24291b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike = _file_like(sio) 24301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.write('foo') 24311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=lambda: flike.flush()) 24321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.flush() 24331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller assert sio.getvalue() == 'foo' 24341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 2435e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk# 2436e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk# Test interaction with socket timeouts - see Issue #6056 2437e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk# 2438e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk 2439e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerkclass TestTimeouts(unittest.TestCase): 2440e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk @classmethod 2441e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk def _test_timeout(cls, child, address): 2442e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk time.sleep(1) 2443e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk child.send(123) 2444e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk child.close() 2445e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk conn = multiprocessing.connection.Client(address) 2446e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk conn.send(456) 2447e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk conn.close() 2448e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk 2449e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk def test_timeout(self): 2450e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk old_timeout = socket.getdefaulttimeout() 2451e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk try: 2452e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk socket.setdefaulttimeout(0.1) 2453e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk parent, child = multiprocessing.Pipe(duplex=True) 2454e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk l = multiprocessing.connection.Listener(family='AF_INET') 2455e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk p = multiprocessing.Process(target=self._test_timeout, 2456e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk args=(child, l.address)) 2457e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk p.start() 2458e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk child.close() 2459e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk self.assertEqual(parent.recv(), 123) 2460e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk parent.close() 2461e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk conn = l.accept() 2462e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk self.assertEqual(conn.recv(), 456) 2463e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk conn.close() 2464e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk l.close() 2465e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk p.join(10) 2466e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk finally: 2467e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk socket.setdefaulttimeout(old_timeout) 2468e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk 2469faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# 2470faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# Test what happens with no "if __name__ == '__main__'" 2471faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# 2472faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk 2473faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerkclass TestNoForkBomb(unittest.TestCase): 2474faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk def test_noforkbomb(self): 2475faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk name = os.path.join(os.path.dirname(__file__), 'mp_fork_bomb.py') 2476faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk if WIN32: 2477faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk rc, out, err = test.script_helper.assert_python_failure(name) 24787fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka self.assertEqual(out, '') 24797fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka self.assertIn('RuntimeError', err) 2480faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk else: 2481faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk rc, out, err = test.script_helper.assert_python_ok(name) 24827fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka self.assertEqual(out.rstrip(), '123') 24837fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka self.assertEqual(err, '') 2484faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk 2485faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# 24868927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson# Issue 12098: check sys.flags of child matches that for parent 24878927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson# 24888927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson 24898927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónssonclass TestFlags(unittest.TestCase): 24908927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson @classmethod 24918927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson def run_in_grandchild(cls, conn): 24928927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson conn.send(tuple(sys.flags)) 24938927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson 24948927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson @classmethod 24958927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson def run_in_child(cls): 24968927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson import json 24978927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson r, w = multiprocessing.Pipe(duplex=False) 24988927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson p = multiprocessing.Process(target=cls.run_in_grandchild, args=(w,)) 24998927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson p.start() 25008927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson grandchild_flags = r.recv() 25018927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson p.join() 25028927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson r.close() 25038927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson w.close() 25048927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson flags = (tuple(sys.flags), grandchild_flags) 25058927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson print(json.dumps(flags)) 25068927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson 25077fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka @test_support.requires_unicode # XXX json needs unicode support 25088927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson def test_flags(self): 25098927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson import json, subprocess 25108927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson # start child process using unusual flags 25118927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson prog = ('from test.test_multiprocessing import TestFlags; ' + 25128927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson 'TestFlags.run_in_child()') 25138927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson data = subprocess.check_output( 2514625af8e13ea3bdd83fd46cbd6d0bc44d97df9355Benjamin Peterson [sys.executable, '-E', '-B', '-O', '-c', prog]) 25158927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson child_flags, grandchild_flags = json.loads(data.decode('ascii')) 25168927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson self.assertEqual(child_flags, grandchild_flags) 25177bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk 25187bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk# 25197bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk# Issue #17555: ForkAwareThreadLock 25207bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk# 25217bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk 25227bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerkclass TestForkAwareThreadLock(unittest.TestCase): 25237bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk # We recurisvely start processes. Issue #17555 meant that the 25247bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk # after fork registry would get duplicate entries for the same 25257bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk # lock. The size of the registry at generation n was ~2**n. 25267bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk 25277bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk @classmethod 25287bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk def child(cls, n, conn): 25297bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk if n > 1: 25307bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk p = multiprocessing.Process(target=cls.child, args=(n-1, conn)) 25317bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk p.start() 25327bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk p.join() 25337bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk else: 25347bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk conn.send(len(util._afterfork_registry)) 25357bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk conn.close() 25367bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk 25377bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk def test_lock(self): 25387bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk r, w = multiprocessing.Pipe(False) 25397bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk l = util.ForkAwareThreadLock() 25407bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk old_size = len(util._afterfork_registry) 25417bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk p = multiprocessing.Process(target=self.child, args=(5, w)) 25427bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk p.start() 25437bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk new_size = r.recv() 25447bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk p.join() 25457bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk self.assertLessEqual(new_size, old_size) 25467bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk 25478927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson# 254841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk# Issue #17097: EINTR should be ignored by recv(), send(), accept() etc 254941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk# 255041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk 255141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerkclass TestIgnoreEINTR(unittest.TestCase): 255241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk 255341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk @classmethod 255441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk def _test_ignore(cls, conn): 255541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk def handler(signum, frame): 255641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk pass 255741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk signal.signal(signal.SIGUSR1, handler) 255841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn.send('ready') 255941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk x = conn.recv() 256041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn.send(x) 256141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn.send_bytes(b'x'*(1024*1024)) # sending 1 MB should block 256241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk 256341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk @unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1') 256441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk def test_ignore(self): 256541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn, child_conn = multiprocessing.Pipe() 256641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk try: 256741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p = multiprocessing.Process(target=self._test_ignore, 256841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk args=(child_conn,)) 256941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p.daemon = True 257041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p.start() 257141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk child_conn.close() 257241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk self.assertEqual(conn.recv(), 'ready') 257341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk time.sleep(0.1) 257441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk os.kill(p.pid, signal.SIGUSR1) 257541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk time.sleep(0.1) 257641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn.send(1234) 257741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk self.assertEqual(conn.recv(), 1234) 257841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk time.sleep(0.1) 257941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk os.kill(p.pid, signal.SIGUSR1) 258041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk self.assertEqual(conn.recv_bytes(), b'x'*(1024*1024)) 258141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk time.sleep(0.1) 258241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p.join() 258341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk finally: 258441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn.close() 258541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk 258641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk @classmethod 258741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk def _test_ignore_listener(cls, conn): 258841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk def handler(signum, frame): 258941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk pass 259041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk signal.signal(signal.SIGUSR1, handler) 259141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk l = multiprocessing.connection.Listener() 259241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn.send(l.address) 259341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk a = l.accept() 259441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk a.send('welcome') 259541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk 259641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk @unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1') 259741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk def test_ignore_listener(self): 259841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn, child_conn = multiprocessing.Pipe() 259941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk try: 260041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p = multiprocessing.Process(target=self._test_ignore_listener, 260141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk args=(child_conn,)) 260241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p.daemon = True 260341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p.start() 260441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk child_conn.close() 260541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk address = conn.recv() 260641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk time.sleep(0.1) 260741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk os.kill(p.pid, signal.SIGUSR1) 260841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk time.sleep(0.1) 260941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk client = multiprocessing.connection.Client(address) 261041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk self.assertEqual(client.recv(), 'welcome') 261141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk p.join() 261241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk finally: 261341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk conn.close() 261441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk 261541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk# 2616faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# 2617faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# 2618faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk 26191b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers, 26208927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson TestStdinBadfiledescriptor, TestTimeouts, TestNoForkBomb, 262141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk TestFlags, TestForkAwareThreadLock, TestIgnoreEINTR] 26220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 2623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None): 262818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller if sys.platform.startswith("linux"): 262918623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller try: 263018623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller lock = multiprocessing.RLock() 263118623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller except OSError: 2632bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!") 2633ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson 26346392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali check_enough_semaphores() 26356392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali 2636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if run is None: 2637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from test.test_support import run_unittest as run 2638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.get_temp_dir() # creates temp directory for use by all processes 2640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.get_logger().setLevel(LOG_LEVEL) 2642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2643146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool = multiprocessing.Pool(4) 2644146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool = multiprocessing.dummy.Pool(4) 2645146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.__init__() 2646146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.start() 2647146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool = ManagerMixin.manager.Pool(4) 2648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson testcases = ( 2650146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + 2651146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + 26520c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + 26530c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz testcases_other 2654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 2655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase 2657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) 265813623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # (ncoghlan): Whether or not sys.exc_clear is executed by the threading 265913623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # module during these tests is at least platform dependent and possibly 266014459d5b1b800854ef8f1bbadf019682a6413a32Nick Coghlan # non-deterministic on any given platform. So we don't mind if the listed 266113623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # warnings aren't actually raised. 266207627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna with test_support.check_py3k_warnings( 266313623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan (".+__(get|set)slice__ has been removed", DeprecationWarning), 266413623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan (r"sys.exc_clear\(\) not supported", DeprecationWarning), 266513623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan quiet=True): 266607627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna run(suite) 2667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2668146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool.terminate() 2669146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool.terminate() 2670146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool.terminate() 2671146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.shutdown() 2672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2673146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool 2674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main(): 2676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson test_main(unittest.TextTestRunner(verbosity=2).run) 2677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__': 2679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson main() 2680