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