def test_pending_calls_race(self): # Issue #14406: multi-threaded race condition when waiting on all # futures. event = threading.Event() def future_func(): event.wait() #oldswitchinterval = sys.getswitchinterval() #sys.setswitchinterval(1e-6) try: fs = {self.executor.submit(future_func) for i in range(100)} event.set() futures.wait(fs, return_when=futures.ALL_COMPLETED) finally: #sys.setswitchinterval(oldswitchinterval) pass
def test_first_exception_one_already_failed(self): future1 = self.executor.submit(time.sleep, 0.2) finished, pending = futures.wait([EXCEPTION_FUTURE, future1], return_when=futures.FIRST_EXCEPTION) self.assertEqual(set([EXCEPTION_FUTURE]), finished) self.assertEqual(set([future1]), pending)
def test_first_exception(self): future1 = self.executor.submit(mul, 2, 21) future2 = self.executor.submit(sleep_and_raise, 0.15) future3 = self.executor.submit(time.sleep, 0.3) finished, pending = futures.wait([future1, future2, future3], return_when=futures.FIRST_EXCEPTION) self.assertEqual(set([future1, future2]), finished) self.assertEqual(set([future3]), pending)
def test_first_completed_some_already_completed(self): future1 = self.executor.submit(time.sleep, 0.15) finished, pending = futures.wait( [CANCELLED_AND_NOTIFIED_FUTURE, SUCCESSFUL_FUTURE, future1], return_when=futures.FIRST_COMPLETED) self.assertEqual( set([CANCELLED_AND_NOTIFIED_FUTURE, SUCCESSFUL_FUTURE]), finished) self.assertEqual(set([future1]), pending)
def test_first_completed(self): #future1 = self.executor.submit(mul, 21, 2) future1 = self.executor.submit(time.sleep, 0.05) future2 = self.executor.submit(time.sleep, 0.15) done, not_done = futures.wait([CANCELLED_FUTURE, future1, future2], return_when=futures.FIRST_COMPLETED) #self.assertEqual(set([future1]), done) #self.assertEqual(set([CANCELLED_FUTURE, future2]), not_done) #cancelled is effettive immediately self.assertEqual(set([CANCELLED_FUTURE]), done) self.assertEqual(set([future1, future2]), not_done) future1 = self.executor.submit(mul, 21, 2) future2 = self.executor.submit(time.sleep, 0.15) done, not_done = futures.wait([future1, future2], return_when=futures.FIRST_COMPLETED) self.assertEqual(set([future1]), done) self.assertEqual(set([future2]), not_done)
def test_all_completed(self): future1 = self.executor.submit(divmod, 2, 0) future2 = self.executor.submit(mul, 2, 21) finished, pending = futures.wait([ SUCCESSFUL_FUTURE, CANCELLED_AND_NOTIFIED_FUTURE, EXCEPTION_FUTURE, future1, future2 ], return_when=futures.ALL_COMPLETED) self.assertEqual( set([ SUCCESSFUL_FUTURE, CANCELLED_AND_NOTIFIED_FUTURE, EXCEPTION_FUTURE, future1, future2 ]), finished) self.assertEqual(set(), pending)
def test_timeout(self): future1 = self.executor.submit(mul, 6, 7) future2 = self.executor.submit(time.sleep, 0.6) finished, pending = futures.wait([ CANCELLED_AND_NOTIFIED_FUTURE, EXCEPTION_FUTURE, SUCCESSFUL_FUTURE, future1, future2 ], timeout=0.5, return_when=futures.ALL_COMPLETED) self.assertEqual( set([ CANCELLED_AND_NOTIFIED_FUTURE, EXCEPTION_FUTURE, SUCCESSFUL_FUTURE, future1 ]), finished) self.assertEqual(set([future2]), pending)
def test_first_exception_some_already_complete(self): future1 = self.executor.submit(divmod, 21, 0) future2 = self.executor.submit(time.sleep, 0.15) finished, pending = futures.wait( [ SUCCESSFUL_FUTURE, #CANCELLED_FUTURE, CANCELLED_AND_NOTIFIED_FUTURE, future1, future2 ], return_when=futures.FIRST_EXCEPTION) self.assertEqual( set([SUCCESSFUL_FUTURE, CANCELLED_AND_NOTIFIED_FUTURE, future1]), finished) #self.assertEqual(set([CANCELLED_FUTURE, future2]), pending) self.assertEqual(set([future2]), pending)