test_multiprocessing.py revision a06e9b8f6b2edf4936146fa8867f12222106d0f8
176cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller#!/usr/bin/env python 276cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller 3dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 4dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Unit tests for the multiprocessing package 5dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 6dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 7dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport unittest 8dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport Queue 9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time 10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys 11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os 12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc 13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal 14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array 15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket 16dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random 17dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging 18c4920e86ef7511b4e858028e870b1811437a71d0Mark Dickinsonfrom test import test_support 191b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerfrom StringIO import StringIO 203db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray_multiprocessing = test_support.import_module('_multiprocessing') 21613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# import threading after _multiprocessing to raise a more revelant error 22613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# message: "No module named _multiprocessing". _multiprocessing is not compiled 23613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# without thread support. 24613b4cf28337902a586f259c6144083771fc06e5Victor Stinnerimport threading 253db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray 2637040cdace1982772e5f35e4acfa13861d72065dJesse Noller# Work around broken sem_open implementations 273db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murraytest_support.import_module('multiprocessing.synchronize') 2837040cdace1982772e5f35e4acfa13861d72065dJesse Noller 29dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.dummy 30dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.connection 31dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.managers 32dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.heap 33dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.pool 34dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 35dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing import util 36dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 37a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtintry: 38a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin from multiprocessing.sharedctypes import Value, copy 39a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin HAS_SHAREDCTYPES = True 40a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtinexcept ImportError: 41a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin HAS_SHAREDCTYPES = False 42a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin 43dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 44dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 45dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 46dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 47e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str 48dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 49dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 50dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants 51dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 52dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 53dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING 54654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG 55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1 57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False # making true makes tests take a lot longer 58dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # and can sometimes cause some non-serious 59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # failures because some calls block a bit 60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # longer than expected 61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS: 62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4 63dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse: 64dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1 65dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing, 67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'HAVE_BROKEN_SEM_GETVALUE', False) 68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 699a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32") 709a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 7236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# Some tests require ctypes 7336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# 7436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 7536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunatry: 7613623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan from ctypes import Structure, c_int, c_double 7736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunaexcept ImportError: 7836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna Structure = object 7936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna c_int = c_double = None 8036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 8136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# 82dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish 83dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 84dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 85dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object): 86dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self, func): 88dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.func = func 89dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = None 90dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 91dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __call__(self, *args, **kwds): 92dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = time.time() 93dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 94dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.func(*args, **kwds) 95dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson finally: 96dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = time.time() - t 97dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 98dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 99dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases 100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object): 103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'manager', 'threads') 105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertTimingAlmostEqual(self, a, b): 107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if CHECK_TIMINGS: 108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(a, b, 1) 109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertReturnsIfImplemented(self, value, func, *args): 111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = func(*args) 113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.assertEqual(value, res) 117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore 120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self): 123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.get_value() 125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._Semaphore__value 128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._value 131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise NotImplementedError 133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases 136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase): 139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_current(self): 143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 1475bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller authkey = current.authkey 148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(current.is_alive()) 1505bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertTrue(not current.daemon) 151b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti self.assertIsInstance(authkey, bytes) 152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(len(authkey) > 0) 1535bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.ident, os.getpid()) 1545bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.exitcode, None) 155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, q, *args, **kwds): 157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(args) 159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(kwds) 1605bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(current.name) 161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1625bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(bytes(current.authkey)) 163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(current.pid) 164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_process(self): 166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue(1) 167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.Event() 168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args = (q, 1, 2) 169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson kwargs = {'hello':23, 'bye':2.54} 170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson name = 'SomeProcess' 171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test, args=args, kwargs=kwargs, name=name 173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1745bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1785bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.authkey, current.authkey) 179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), False) 1805bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.daemon, True) 181aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(self.active_children()) is list) 1835bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1875bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.exitcode, None) 188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), True) 189aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), args[1:]) 192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), kwargs) 1935bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(q.get(), p.name) 194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1955bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(q.get(), current.authkey) 196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), p.pid) 197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.exitcode, 0) 201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), False) 202aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_terminate(self): 205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(1000) 206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_terminate) 2125bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), True) 216aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 2175bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.terminate() 220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(p.join) 222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(join(), None) 223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(join.elapsed, 0.0) 224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), False) 226aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2305bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller # XXX sometimes get p.exitcode == 0 on Windows ... 2315bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller #self.assertEqual(p.exitcode, -signal.SIGTERM) 232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_cpu_count(self): 234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = multiprocessing.cpu_count() 236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = 1 238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(cpus) is int) 239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(cpus >= 1) 240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_active_children(self): 242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(self.active_children()), list) 243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=time.sleep, args=(DELTA,)) 245aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 248aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 251aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_recursion(self, wconn, id): 254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from multiprocessing import forking 255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wconn.send(id) 256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(id) < 2: 257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(2): 258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_recursion, args=(wconn, id+[i]) 260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_recursion(self): 265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, wconn = self.Pipe(duplex=False) 266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_recursion(wconn, []) 267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [] 270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson while rconn.poll(): 271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result.append(rconn.recv()) 272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [ 274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [], 275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0], 276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 0], 277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 1], 278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1], 279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 0], 280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 1] 281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, expected) 283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process): 289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self): 291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.Process.__init__(self) 292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn, self.parent_conn = multiprocessing.Pipe() 293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def run(self): 295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for s in iter(self.child_conn.recv, None): 297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.send(s.upper()) 298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def submit(self, s): 301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson assert type(s) is str 302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(s) 303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.parent_conn.recv() 304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def stop(self): 306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(None) 307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase): 311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_subclassing(self): 315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser = _UpperCaser() 316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.start() 317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('hello'), 'HELLO') 318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('world'), 'WORLD') 319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.stop() 320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.join() 321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q): 327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'empty'): 328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.empty() 329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == 0 331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize): 333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'full'): 334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.full() 335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == maxsize 337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase): 340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_put(self, queue, child_can_start, parent_can_continue): 343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(6): 345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.get() 346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_put(self): 349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson MAXSIZE = 6 350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue(maxsize=MAXSIZE) 351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_put, 356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 3585bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(1) 365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2, True) 366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3, True, None) 367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4, False) 368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5, False, None) 369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put_nowait(6) 370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # the values may be in buffer but not yet in pipe so sleep a bit 372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), True) 376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put = TimingWrapper(queue.put) 378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put_nowait = TimingWrapper(queue.put_nowait) 379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False) 381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, None) 384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put_nowait, 7) 387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put_nowait.elapsed, 0) 388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1) 390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1) 391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2) 393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3) 396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3) 397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_get(self, queue, child_can_start, parent_can_continue): 407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 408da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #queue.put(1) 409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2) 410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3) 411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4) 412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5) 413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_get(self): 416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_get, 422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 4245bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 435da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson # Hangs unexpectedly, remove for now 436da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #self.assertEqual(queue.get(), 1) 437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True, None), 2) 438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True), 3) 439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(timeout=1), 4) 440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get_nowait(), 5) 441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(queue.get) 445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get_nowait = TimingWrapper(queue.get_nowait) 446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False) 448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, None) 451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get_nowait) 454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get_nowait.elapsed, 0) 455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, True, TIMEOUT1) 457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, TIMEOUT2) 460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3) 463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3) 464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_fork(self, queue): 468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10, 20): 469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # note that at this point the items may only be buffered, so the 471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process cannot shutdown until the feeder thread has finished 472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pushing items onto the pipe. 473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_fork(self): 475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Old versions of Queue would fail to create a new feeder 476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # thread for a forked process if the original process had its 477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # own feeder thread. This test checks that this no longer 478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # happens. 479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # put items on queue so that main process starts a feeder thread 483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait to make sure thread starts before we fork a new process 487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # fork process 490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_fork, args=(queue,)) 491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check that all expected items are in the queue 494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(20): 495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), i) 496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, queue.get, False) 497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_qsize(self): 501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue() 502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(1) 507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(5) 509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 2) 510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_task_done(self, q): 516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for obj in iter(q.get, None): 517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.task_done() 519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_task_done(self): 521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.JoinableQueue() 522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'): 52436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna self.skipTest("requires 'queue.task_done()' method") 525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson workers = [self.Process(target=self._test_task_done, args=(queue,)) 527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(4)] 528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.join() 536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(None) 539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase): 548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_lock(self): 550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(False), False) 553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((ValueError, threading.ThreadError), lock.release) 555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rlock(self): 557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.RLock() 558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((AssertionError, RuntimeError), lock.release) 565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 56682eb5902ce169be81110c79662b772b904cd00fcJesse Noller def test_lock_context(self): 56782eb5902ce169be81110c79662b772b904cd00fcJesse Noller with self.Lock(): 56882eb5902ce169be81110c79662b772b904cd00fcJesse Noller pass 56982eb5902ce169be81110c79662b772b904cd00fcJesse Noller 570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase): 572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_semaphore(self, sem): 574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(False), False) 580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_semaphore(self): 587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(2) 588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(3, get_value, sem) 591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(4, get_value, sem) 593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_bounded_semaphore(self): 595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.BoundedSemaphore(2) 596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Currently fails on OS/X 598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #if HAVE_GETVALUE: 599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertRaises(ValueError, sem.release) 600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertReturnsIfImplemented(2, get_value, sem) 601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(0) 607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson acquire = TimingWrapper(sem.acquire) 608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False), False) 610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, None), False) 613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, TIMEOUT1), False) 616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0) 617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(True, TIMEOUT2), False) 619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2) 620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(timeout=TIMEOUT3), False) 622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3) 623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase): 626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self, cond, sleeping, woken, timeout=None): 628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.release() 630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.wait(timeout) 631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.release() 632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def check_invariant(self, cond): 635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # this is only supposed to succeed when there are no sleepers 636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleepers = (cond._sleeping_count.get_value() - 639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond._woken_count.get_value()) 640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sleepers, 0) 641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(cond._wait_semaphore.get_value(), 0) 642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify(self): 646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 6515bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 6555bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for both children to start sleeping 659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up one process/thread 667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check one process/thread has woken up 672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, woken) 674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up another 676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check other has woken up 681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, woken) 683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify_all(self): 689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some threads/processes which will timeout 694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, 696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 6975bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, 701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 702a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them all to sleep 706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all timed out 710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.acquire() 712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some more threads/processes 718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 7205bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 724a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them to all sleep 728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake them all up 736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify_all() 738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all woken 741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(6, get_value, woken) 743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(cond.wait) 750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = wait(TIMEOUT1) 752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(res, None) 754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase): 758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_event(self, event): 760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(TIMEOUT2) 761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_event(self): 764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event = self.Event() 765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(event.wait) 766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Removed temporaily, due to API shear, this does not 768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # work with threading._Event objects. is_set == isSet 76902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), False) 770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 77102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # Removed, threading.Event.wait() will return the value of the __flag 77202cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # instead of None. API Shear with the semaphore backed mp.Event 77302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(0.0), False) 774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 77502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), False) 776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # See note above on the API differences 78102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), True) 78202cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 78402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), True) 785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertEqual(event.is_set(), True) 787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.clear() 789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #self.assertEqual(event.is_set(), False) 791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_event, args=(event,)).start() 79302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 799a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin@unittest.skipUnless(HAS_SHAREDCTYPES, 800a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin "requires multiprocessing.sharedctypes") 801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase): 802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 80336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ALLOWED_TYPES = ('processes',) 80436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson codes_values = [ 806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('i', 4343, 24234), 807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('d', 3.625, -4.25), 808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('h', -232, 234), 809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('c', latin('x'), latin('y')) 810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, values): 813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sv.value = cv[2] 815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_value(self, raw=False): 818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.RawValue(code, value) 820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.Value(code, value) 823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[1]) 827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process(target=self._test, args=(values,)) 829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[2]) 834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawvalue(self): 836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_value(raw=True) 837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock(self): 839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val1 = self.Value('i', 5) 840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = val1.get_lock() 841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = val1.get_obj() 842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val2 = self.Value('i', 5, lock=None) 844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = val2.get_lock() 845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = val2.get_obj() 846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val3 = self.Value('i', 5, lock=lock) 849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = val3.get_lock() 850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = val3.get_obj() 851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8536ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Value('i', 5, lock=False) 854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8576ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue') 8586ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 8596ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawValue('i', 5) 8606ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 8616ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 8626ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase): 865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 86636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ALLOWED_TYPES = ('processes',) 86736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self, seq): 869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1, len(seq)): 870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq[i] += seq[i-1] 871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 87236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_array(self, raw=False): 874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831] 875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.RawArray('i', seq) 877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.Array('i', seq) 879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(len(arr), len(seq)) 881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(arr[3], seq[3]) 882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[2:7]), list(seq[2:7])) 883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4]) 885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.f(seq) 889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(arr,)) 891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 89636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawarray(self): 898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_array(raw=True) 899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 90036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(c_int is None, "requires _ctypes") 901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock_obj(self): 902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr1 = self.Array('i', range(10)) 903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = arr1.get_lock() 904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = arr1.get_obj() 905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr2 = self.Array('i', range(10), lock=None) 907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = arr2.get_lock() 908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = arr2.get_obj() 909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr3 = self.Array('i', range(10), lock=lock) 912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = arr3.get_lock() 913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = arr3.get_obj() 914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 9166ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Array('i', range(10), lock=False) 917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 9196ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, 9206ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.Array, 'i', range(10), lock='notalock') 9216ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 9226ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawArray('i', range(10)) 9236ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 9246ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase): 931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_list(self): 935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = self.list(range(10)) 936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = self.list() 939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], []) 940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b.extend(range(5)) 942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], range(5)) 943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2], 2) 945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2:10], [2,3,4]) 946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b *= 2 948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) 949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6]) 951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = [a, b] 955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.list(d) 956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual( 957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e[:], 958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]] 959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson f = self.list([a]) 962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.append('hello') 963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']]) 964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_dict(self): 966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = self.dict() 967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson indices = range(65, 70) 968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in indices: 969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[i] = chr(i) 970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices)) 971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.keys()), indices) 972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.values()), [chr(i) for i in indices]) 973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices]) 974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_namespace(self): 976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n = self.Namespace() 977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.name = 'Bob' 978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.job = 'Builder' 979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n._hidden = 'hidden' 980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual((n.name, n.job), ('Bob', 'Builder')) 981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del n.job 982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(str(n), "Namespace(name='Bob')") 983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(hasattr(n, 'name')) 984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(not hasattr(n, 'job')) 985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0): 991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(wait) 992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return x*x 993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase): 994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_apply(self): 996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson papply = self.pool.apply 997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (5,)), sqr(5)) 998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3)) 999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_map(self): 1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pmap = self.pool.map 1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10))) 1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(100), chunksize=20), 1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson map(sqr, range(100))) 1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 10067530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller def test_map_chunksize(self): 10077530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller try: 10087530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1) 10097530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller except multiprocessing.TimeoutError: 10107530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.fail("pool.map_async with chunksize stalled on null list") 10117530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller 1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async(self): 1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) 1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(get(), 49) 1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async_timeout(self): 1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2)) 1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2) 1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2) 1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap(self): 1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(it), map(sqr, range(10))) 1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(1000), chunksize=100) 1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1000): 1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap_unordered(self): 1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000)) 1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000), chunksize=53) 1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_make_pool(self): 1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = multiprocessing.Pool(3) 1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(3, len(p._pool)) 1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.close() 1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'manager': 1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # On Unix a forked process increfs each shared object to 1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # which its parent process held a reference. If the 1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # forked process gets terminated then there is likely to 1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # be a reference leak. So to prevent 1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # _TestZZZNumberOfObjects from failing we skip this test 1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # when using a manager. 1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = self.pool.map_async( 1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep, [0.1 for i in range(10000)], chunksize=1 1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.pool.terminate() 1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(self.pool.join) 1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join() 1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(join.elapsed < 0.2) 1068654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1069654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase): 1070654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1071654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller ALLOWED_TYPES = ('processes', ) 1072654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller def test_pool_worker_lifetime(self): 1073654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p = multiprocessing.Pool(3, maxtasksperchild=10) 1074654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(3, len(p._pool)) 1075654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller origworkerpids = [w.pid for w in p._pool] 1076654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Run many tasks so each worker gets replaced (hopefully) 1077654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results = [] 1078654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for i in range(100): 1079654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results.append(p.apply_async(sqr, (i, ))) 1080654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Fetch the results and verify we got the right answers, 1081654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # also ensuring all the tasks have completed. 1082654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for (j, res) in enumerate(results): 1083654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(res.get(), sqr(j)) 1084654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Refill the pool 1085654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p._repopulate_pool() 10863bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # Wait until all workers are alive 10873bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna countdown = 5 10883bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna while countdown and not all(w.is_alive() for w in p._pool): 10893bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna countdown -= 1 10903bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna time.sleep(DELTA) 1091654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller finalworkerpids = [w.pid for w in p._pool] 10923bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # All pids should be assigned. See issue #7805. 10933bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna self.assertNotIn(None, origworkerpids) 10943bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna self.assertNotIn(None, finalworkerpids) 10953bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna # Finally, check that the worker pids have changed 1096654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids)) 1097654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.close() 1098654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.join() 1099654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left 1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase): 1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because test cases are sorted alphabetically, this one will get 1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # run after all the other tests for the manager. It tests that 1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # there have been no "reference leaks" for the manager's shared 1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # objects. Note the comment in _TestPool.test_terminate(). 1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_number_of_objects(self): 1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson EXPECTED_NUMBER = 1 # the pool object is still alive 1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.active_children() # discard dead process objs 1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson gc.collect() # do garbage collection 1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson refs = self.manager._number_of_objects() 11167314b38168da53863136d1937059fc0ac4883a56Jesse Noller debug_info = self.manager._debug_info() 1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if refs != EXPECTED_NUMBER: 11187fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller print self.manager._debug_info() 11197314b38168da53863136d1937059fc0ac4883a56Jesse Noller print debug_info 1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(refs, EXPECTED_NUMBER) 1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class 1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError 1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object): 1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self): 1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 'f()' 1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def g(self): 1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise ValueError 1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _h(self): 1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return '_h()' 1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz(): 1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson yield i*i 1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy): 1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _exposed_ = ('next', '__next__') 1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __iter__(self): 1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self 1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def next(self): 1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('next') 1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __next__(self): 1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('__next__') 1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager): 1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar) 1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h')) 1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy) 1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase): 1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_mymanager(self): 1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = MyManager() 1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = manager.Foo() 1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = manager.Bar() 1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson baz = manager.baz() 1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)] 1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)] 1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo_methods, ['f', 'g']) 1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar_methods, ['f', '_h']) 1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.f(), 'f()') 1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, foo.g) 1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo._callmethod('f'), 'f()') 1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(RemoteError, foo._callmethod, '_h') 1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.f(), 'f()') 1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._h(), '_h()') 1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('f'), 'f()') 1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('_h'), '_h()') 1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(baz), [i*i for i in range(10)]) 1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization 1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue() 1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue(): 1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return _queue 1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager): 1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class used by server process''' 1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue) 1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager): 1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class which specifies the same interface as QueueManager''' 1204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue') 1205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib' 1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase): 1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _putter(self, address, authkey): 1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager2( 1215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=address, authkey=authkey, serializer=SERIALIZER 1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.connect() 1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager.get_queue() 1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(('hello world', None, True, 2.25)) 1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_remote(self): 1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson authkey = os.urandom(32) 1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager( 1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=('localhost', 0), authkey=authkey, serializer=SERIALIZER 1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._putter, args=(manager.address, authkey)) 1230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2 = QueueManager2( 1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=manager.address, authkey=authkey, serializer=SERIALIZER 1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2.connect() 1236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager2.get_queue() 1237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Note that xmlrpclib will deserialize object as a list not a tuple 1239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), ['hello world', None, True, 2.25]) 1240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because we are using xmlrpclib for serialization instead of 1242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pickle this will cause a serialization error. 1243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Exception, queue.put, time.sleep) 1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Make queue finalizer run before the server is stopped 1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del queue 1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1249459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase): 1250459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1251459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def _putter(self, address, authkey): 1252459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1253459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=address, authkey=authkey, serializer=SERIALIZER) 1254459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.connect() 1255459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1256459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue.put('hello world') 1257459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1258459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def test_rapid_restart(self): 1259459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller authkey = os.urandom(32) 1260459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 126154f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou address=('localhost', 0), authkey=authkey, serializer=SERIALIZER) 126254f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou addr = manager.get_server().address 1263459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1264459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1265459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p = self.Process(target=self._putter, args=(manager.address, authkey)) 1266459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p.start() 1267459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1268459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller self.assertEqual(queue.get(), 'hello world') 1269019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller del queue 1270459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.shutdown() 1271459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 127254f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou address=addr, authkey=authkey, serializer=SERIALIZER) 1273459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1274019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller manager.shutdown() 1275459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('') 1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase): 1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _echo(self, conn): 1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for msg in iter(conn.recv_bytes, SENTINEL): 1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_connection(self): 1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 12955bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [1, 2.25, None] 1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello world') 1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson longmsg = msg * 10 1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = array.array('i', range(4)) 1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(conn.fileno()), int) 1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send(seq), None) 1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), seq) 1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(msg), None) 1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = list(arr) + [0] * (10 - len(arr)) 1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer), 1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr)) 1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize), 1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = bytearray(latin(' ' * 40)) 1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(longmsg), None) 1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = conn.recv_bytes_into(buffer) 1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except multiprocessing.BufferTooShort, e: 1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(e.args, (longmsg,)) 1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.fail('expected BufferTooShort, got %s' % res) 1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson poll = TimingWrapper(conn.poll) 1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(), False) 1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), False) 1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) 1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(None) 1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), True) 1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), None) 1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson really_big_msg = latin('X') * (1024 * 1024 * 16) # 16Mb 1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(really_big_msg) 1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), really_big_msg) 1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) # tell child to quit 1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() 1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.readable, True) 1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.writable, True) 1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv) 1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv_bytes) 1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_duplex_false(self): 1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = self.Pipe(duplex=False) 1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.send(1), None) 1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.recv(), 1) 1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.readable, True) 1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.writable, False) 1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.readable, False) 1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.writable, True) 1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, reader.send, 2) 1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.recv) 1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.poll) 1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_spawn_close(self): 1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # We test that a pipe connection can be closed by parent 1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process immediately after child is spawned. On Windows this 1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # would have sometimes failed on old versions because 1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # child_conn would be closed before the child got a chance to 1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # duplicate it. 1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() # this might complete before child initializes 1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello') 1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) 1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sendbytes(self): 1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('abcdefghijklmnopqrstuvwxyz') 1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a, b = self.Pipe() 1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg) 1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg) 1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 5) 1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[5:]) 1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 7, 8) 1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[7:7+8]) 1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26) 1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26, 0) 1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 27) 1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 22, 5) 1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 26, 1) 1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, -1) 1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) 1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase): 1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, address): 1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = self.connection.Client(address) 1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send('hello') 1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_listener_client(self): 1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for family in self.connection.families: 1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=family) 1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test, args=(l.address,)) 14445bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = l.accept() 1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), 'hello') 1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.close() 1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes 1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1453da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase): 1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _listener(self, conn, families): 1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=fam) 1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.address) 1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = l.accept() 1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = socket.socket() 1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.bind(('localhost', 0)) 1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.getsockname()) 1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.listen(1) 1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn, addr = l.accept() 1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.recv() 1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _remote(self, conn): 1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for (address, msg) in iter(conn.recv, None): 1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = self.connection.Client(address) 1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.send(msg.upper()) 1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address, msg = conn.recv() 1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = socket.socket() 1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.connect(address) 1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.sendall(msg.upper()) 1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_pickling(self): 1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.allow_connection_pickling() 1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except ImportError: 1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson families = self.connection.families 1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn, lconn0 = self.Pipe() 1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp = self.Process(target=self._listener, args=(lconn0, families)) 1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.start() 1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn0.close() 1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, rconn0 = self.Pipe() 1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp = self.Process(target=self._remote, args=(rconn0,)) 1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.start() 1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn0.close() 1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = ('This connection uses family %s' % fam).encode('ascii') 1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(), msg.upper()) 1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send(None) 1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('This connection uses a normal socket') 1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(socket, 'fromfd'): 1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(100), msg.upper()) 1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # XXX On Windows with Py2.6 need to backport fromfd() 1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson discard = lconn.recv_bytes() 1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.send(None) 1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.close() 1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.close() 1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.join() 1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.join() 1535da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase): 1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_heap(self): 1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson iterations = 5000 1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson maxblocks = 50 1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks = [] 1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # create and destroy lots of blocks of different sizes 1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(iterations): 1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson size = int(random.lognormvariate(0, 1) * 1000) 1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = multiprocessing.heap.BufferWrapper(size) 1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks.append(b) 1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(blocks) > maxblocks: 1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson i = random.randrange(maxblocks) 1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del blocks[i] 1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # get the heap object 1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson heap = multiprocessing.heap.BufferWrapper._heap 1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # verify the state of the heap 1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all = [] 1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied = 0 1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for L in heap._len_to_seq.values(): 1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in L: 1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'free')) 1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in heap._allocated_blocks: 1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'occupied')) 1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied += (stop-start) 1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.sort() 1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(all)-1): 1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (arena, start, stop) = all[i][:3] 1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (narena, nstart, nstop) = all[i+1][:3] 1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue((arena != narena and nstart == 0) or 1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (stop == nstart)) 1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure): 1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _fields_ = [ 1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('x', c_int), 1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('y', c_double) 1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1591a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin@unittest.skipUnless(HAS_SHAREDCTYPES, 1592a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin "requires multiprocessing.sharedctypes") 1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase): 1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _double(self, x, y, foo, arr, string): 1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x.value *= 2 1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y.value *= 2 1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x *= 2 1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y *= 2 1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value *= 2 1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(arr)): 1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[i] *= 2 1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sharedctypes(self, lock=False): 1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x = Value('i', 7, lock=lock) 1608bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl y = Value(c_double, 1.0/3.0, lock=lock) 1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = Value(_Foo, 3, 2, lock=lock) 1610bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl arr = self.Array('d', range(10), lock=lock) 1611bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl string = self.Array('c', 20, lock=lock) 1612a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin string.value = latin('hello') 1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._double, args=(x, y, foo, arr, string)) 1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(x.value, 14) 1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(y.value, 2.0/3.0) 1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.x, 6) 1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(foo.y, 4.0) 1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(arr[i], i*2) 1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(string.value, latin('hellohello')) 1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_synchronize(self): 1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_sharedctypes(lock=True) 1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_copy(self): 1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = _Foo(2, 5.0) 1631a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin bar = copy(foo) 1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x = 0 1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y = 0 1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.x, 2) 1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(bar.y, 5.0) 1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase): 1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_finalize(self, conn): 1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Foo(object): 1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = Foo() 1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(a, conn.send, args=('a',)) 1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del a # triggers callback for a 1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = Foo() 1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b = util.Finalize(b, conn.send, args=('b',)) 1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # triggers callback for b 1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # does nothing because callback has already been called 1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del b # does nothing because callback has already been called 1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c = Foo() 1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(c, conn.send, args=('c',)) 1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d10 = Foo() 1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d10, conn.send, args=('d10',), exitpriority=1) 1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d01 = Foo() 1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d01, conn.send, args=('d01',), exitpriority=0) 1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d02 = Foo() 1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d02, conn.send, args=('d02',), exitpriority=0) 1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d03 = Foo() 1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d03, conn.send, args=('d03',), exitpriority=0) 1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('e',), exitpriority=-10) 1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100) 1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # call mutliprocessing's cleanup function then exit process without 1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # garbage collecting locals 1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util._exit_function() 1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson os._exit(0) 1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_finalize(self): 1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_finalize, args=(child_conn,)) 1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [obj for obj in iter(conn.recv, 'STOP')] 1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) 1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module 1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase): 1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_import(self): 170136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna modules = [ 1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing', 'multiprocessing.connection', 1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.heap', 'multiprocessing.managers', 1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.pool', 'multiprocessing.process', 170536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 'multiprocessing.reduction', 1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.synchronize', 'multiprocessing.util' 170736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna ] 170836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 170936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna if c_int is not None: 171036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna # This module requires _ctypes 171136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna modules.append('multiprocessing.sharedctypes') 1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in modules: 1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson __import__(name) 1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson mod = sys.modules[name] 1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for attr in getattr(mod, '__all__', ()): 1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue( 1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson hasattr(mod, attr), 1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '%r does not have attribute %r' % (mod, attr) 1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output 1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase): 1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_enable_logging(self): 1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(util.SUBWARNING) 1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(logger is not None) 1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.debug('this will not be printed') 1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.info('nor will this') 1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LOG_LEVEL) 1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_level(self, conn): 1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(logger.getEffectiveLevel()) 1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_level(self): 1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL1 = 32 1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL2 = 37 1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger = logging.getLogger() 1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_level = root_logger.level 1750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = multiprocessing.Pipe(duplex=False) 1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LEVEL1) 1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL1, reader.recv()) 1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(logging.NOTSET) 1758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(LEVEL2) 1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL2, reader.recv()) 1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(root_level) 1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(level=LOG_LEVEL) 1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1765814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 17669a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase): 17679a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17689a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def handle(self, record): 17699a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert record.processName == multiprocessing.current_process().name 17709a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = True 17719a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17729a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def test_logging(self): 17739a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler = logging.Handler() 17749a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler.handle = self.handle 17759a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = False 17769a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# # Bypass getLogger() and side-effects 17779a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger = logging.getLoggerClass()( 17789a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 'multiprocessing.test.TestLoggingProcessName') 17799a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.addHandler(handler) 17809a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.propagate = False 17819a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17829a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.warn('foo') 17839a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert self.__handled 1784814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 17869a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321 17879a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 17889a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 17899a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase): 17909a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 179136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna @unittest.skipIf(WIN32, "skipped on Windows") 17929a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller def test_invalid_handles(self): 17939a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller conn = _multiprocessing.Connection(44977608) 17949a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, conn.poll) 17959a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, _multiprocessing.Connection, -1) 179636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna 17979a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module 1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names): 1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = {} 1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in names: 1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = getattr(Source, name) 1805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type(obj) == type(get_attributes): 1806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = staticmethod(obj) 1807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[name] = obj 1808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return d 1809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type): 1811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = {} 1812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson glob = globals() 181336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna Type = type.capitalize() 1814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in glob.keys(): 1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if name.startswith('_Test'): 1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson base = glob[name] 1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type in base.ALLOWED_TYPES: 1819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson newname = 'With' + Type + name[1:] 1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Temp(base, unittest.TestCase, Mixin): 1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result[newname] = Temp 1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__name__ = newname 1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__module__ = Mixin.__module__ 1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return result 1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases 1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object): 1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'processes' 1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing, ( 1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'RawValue', 1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'RawArray', 'current_process', 'active_children', 'Pipe', 1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'connection', 'JoinableQueue' 1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes') 1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes) 1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object): 1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'manager' 1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = object.__new__(multiprocessing.managers.SyncManager) 1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(manager, ( 1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager') 1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager) 1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object): 1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'threads' 1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.dummy.Process 1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing.dummy, ( 1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'current_process', 1865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'active_children', 'Pipe', 'connection', 'dict', 'list', 1866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads') 1870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads) 1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 18720c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase): 18730c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz # TODO: add more tests for deliver/answer challenge. 18740c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_deliver_challenge_auth_failure(self): 18750c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18760c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18772a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18780c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18790c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18800c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18810c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.deliver_challenge, 18820c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 18830c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 18840c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_answer_challenge_auth_failure(self): 18850c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18860c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def __init__(self): 18870c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count = 0 18880c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18890c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count += 1 18900c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz if self.count == 1: 18910c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz return multiprocessing.connection.CHALLENGE 18920c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz elif self.count == 2: 18932a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18942a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'' 18950c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18960c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18970c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18980c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.answer_challenge, 18990c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 19000c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 19017152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 19027152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585 19037152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 19047152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19057152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns): 19067152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller ns.test += 1 19077152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19087152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase): 19097152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def setUp(self): 19107152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr = multiprocessing.Manager() 19117152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns = self.mgr.Namespace() 19127152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns.test = 0 19137152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19147152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def tearDown(self): 19157152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr.shutdown() 19167152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19177152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_manager_initializer(self): 19187152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m = multiprocessing.managers.SyncManager() 19197152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, m.start, 1) 19207152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.start(initializer, (self.ns,)) 19217152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 19227152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.shutdown() 19237152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19247152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_pool_initializer(self): 19257152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, multiprocessing.Pool, initializer=1) 19267152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p = multiprocessing.Pool(1, initializer, (self.ns,)) 19277152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.close() 19287152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.join() 19297152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 19307152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 19321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes 19331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior 19341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 19351b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19361b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q): 19371b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller try: 19381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller item = q.get(block=False) 19391b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller except Queue.Empty: 19401b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pass 19411b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19421b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q): 19431b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 19441b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,)) 19451b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.start() 19461b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.join() 19471b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19481b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x): 19491b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return x*x 19501b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19511b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process(): 19521b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pool = multiprocessing.Pool(processes=4) 19531b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7]) 19541b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19551b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object): 19561b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def __init__(self, delegate): 19571b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate = delegate 19581b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = None 19591b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19601b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller @property 19611b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def cache(self): 19621b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pid = os.getpid() 19631b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller # There are no race conditions since fork keeps only the running thread 19641b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller if pid != self._pid: 19651b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = pid 19661b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 19671b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return self._cache 19681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19691b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def write(self, data): 19701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self.cache.append(data) 19711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def flush(self): 19731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate.write(''.join(self.cache)) 19741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 19751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19761b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase): 19771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_queue_in_process(self): 19791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 19801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=_TestProcess, args=(queue,)) 19811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.start() 19821b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.join() 19831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19841b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_pool_in_process(self): 19851b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p = multiprocessing.Process(target=pool_in_process) 19861b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.start() 19871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.join() 19881b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19891b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_flushing(self): 19901b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller sio = StringIO() 19911b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike = _file_like(sio) 19921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.write('foo') 19931b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=lambda: flike.flush()) 19941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.flush() 19951b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller assert sio.getvalue() == 'foo' 19961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19971b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers, 19981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller TestStdinBadfiledescriptor] 19990c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 2000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 2003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None): 200518623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller if sys.platform.startswith("linux"): 200618623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller try: 200718623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller lock = multiprocessing.RLock() 200818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller except OSError: 2009bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!") 2010ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson 2011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if run is None: 2012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from test.test_support import run_unittest as run 2013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.get_temp_dir() # creates temp directory for use by all processes 2015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.get_logger().setLevel(LOG_LEVEL) 2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2018146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool = multiprocessing.Pool(4) 2019146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool = multiprocessing.dummy.Pool(4) 2020146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.__init__() 2021146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.start() 2022146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool = ManagerMixin.manager.Pool(4) 2023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson testcases = ( 2025146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + 2026146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + 20270c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + 20280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz testcases_other 2029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 2030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase 2032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) 203313623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # (ncoghlan): Whether or not sys.exc_clear is executed by the threading 203413623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # module during these tests is at least platform dependent and possibly 203514459d5b1b800854ef8f1bbadf019682a6413a32Nick Coghlan # non-deterministic on any given platform. So we don't mind if the listed 203613623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan # warnings aren't actually raised. 203707627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna with test_support.check_py3k_warnings( 203813623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan (".+__(get|set)slice__ has been removed", DeprecationWarning), 203913623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan (r"sys.exc_clear\(\) not supported", DeprecationWarning), 204013623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan quiet=True): 204107627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna run(suite) 2042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2043146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool.terminate() 2044146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool.terminate() 2045146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool.terminate() 2046146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.shutdown() 2047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2048146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool 2049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main(): 2051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson test_main(unittest.TextTestRunner(verbosity=2).run) 2052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__': 2054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson main() 2055