def setUp(self): TestAssistant.setUp(self) self._context = MultiprocessingContext() self.executor = TraitsExecutor( context=self._context, event_loop=self._event_loop, ) self.listener = ExecutorListener(executor=self.executor)
def test_max_workers(self): executor = TraitsExecutor( max_workers=11, context=self._context, event_loop=self._event_loop, ) self.assertEqual(executor._worker_pool._max_workers, 11) executor.shutdown(timeout=SAFETY_TIMEOUT)
def temporary_executor(self, **kwds): """ Create a temporary TraitsExecutor, and shut it down properly after use. """ executor = TraitsExecutor(**kwds) try: yield executor finally: executor.shutdown(timeout=SAFETY_TIMEOUT)
def setUp(self): TestAssistant.setUp(self) self._context = MultithreadingContext() self._worker_pool = self._context.worker_pool() self.executor = TraitsExecutor( context=self._context, event_loop=self._event_loop, worker_pool=self._worker_pool, ) self.listener = ExecutorListener(executor=self.executor)
def test_shared_worker_pool(self): with self.temporary_worker_pool() as worker_pool: executor = TraitsExecutor( worker_pool=worker_pool, context=self._context, event_loop=self._event_loop, ) executor.shutdown(timeout=SAFETY_TIMEOUT) # Check that the the shared worker pool is still usable. cf_future = worker_pool.submit(int) self.assertEqual(cf_future.result(), 0)
def main(): """ Demonstrate a GUI that hands off background tasks to a separate process. """ context = MultiprocessingContext() traits_executor = TraitsExecutor(context=context) try: view = SquaringHelper(traits_executor=traits_executor) view.configure_traits() finally: traits_executor.shutdown() context.close()
def test_owned_worker_pool(self): executor = TraitsExecutor( context=self._context, event_loop=self._event_loop, ) worker_pool = executor._worker_pool executor.shutdown(timeout=SAFETY_TIMEOUT) # Check that the internally-created worker pool has been shut down. with self.assertRaises(RuntimeError): worker_pool.submit(int)
def test_thread_pool_argument_deprecated(self): with self.temporary_worker_pool() as worker_pool: with self.assertWarns(DeprecationWarning) as warning_info: executor = TraitsExecutor( thread_pool=worker_pool, context=self._context, event_loop=self._event_loop, ) executor.shutdown(timeout=SAFETY_TIMEOUT) # Check we're using the right stack level in the warning. _, _, this_module = __name__.rpartition(".") self.assertIn(this_module, warning_info.filename)
def test_shared_worker_pool_stop(self): with self.temporary_worker_pool() as worker_pool: executor = TraitsExecutor( worker_pool=worker_pool, context=self._context, event_loop=self._event_loop, ) executor.stop() self.wait_until_stopped(executor) # Check that the the shared worker pool is still usable. cf_future = worker_pool.submit(int) self.assertEqual(cf_future.result(), 0)
def setUp(self): TestAssistant.setUp(self) self._context = MultithreadingContext() self.executor = TraitsExecutor( context=self._context, event_loop=self._event_loop, )
def test_max_workers_mutually_exclusive_with_worker_pool(self): with self.temporary_worker_pool() as worker_pool: with self.assertRaises(TypeError): TraitsExecutor( worker_pool=worker_pool, max_workers=11, context=self._context, event_loop=self._event_loop, )
class TestMyFuture(GuiTestAssistant, unittest.TestCase): def setUp(self): GuiTestAssistant.setUp(self) self.traits_executor = TraitsExecutor() def tearDown(self): # Request the executor to stop, and wait for that stop to complete. self.traits_executor.shutdown(timeout=SAFETY_TIMEOUT) GuiTestAssistant.tearDown(self) def test_my_future(self): future = submit_call(self.traits_executor, pow, 3, 5) # Wait for the future to complete. self.assertEventuallyTrueInGui(lambda: future.done, timeout=SAFETY_TIMEOUT) self.assertEqual(future.result, 243)
class TestTraitsExecutor(TestAssistant, TraitsExecutorTests, unittest.TestCase): def setUp(self): TestAssistant.setUp(self) self._context = MultiprocessingContext() self.executor = TraitsExecutor( context=self._context, event_loop=self._event_loop, ) self.listener = ExecutorListener(executor=self.executor) def tearDown(self): del self.listener self.executor.shutdown(timeout=SAFETY_TIMEOUT) del self.executor self._context.close() del self._context TestAssistant.tearDown(self)
def test_run_until_timeout_trait_fired(self): # Trait fired, but condition still never true. executor = TraitsExecutor( context=MultithreadingContext(), event_loop=self._event_loop, ) future = submit_call(executor, int, "111") start_time = time.monotonic() with self.assertRaises(RuntimeError): self.run_until( future, "state", condition=lambda future: future.state == CANCELLED, timeout=0.1, ) actual_timeout = time.monotonic() - start_time executor.shutdown(timeout=SAFETY_TIMEOUT) self.assertLess(actual_timeout, 1.0)
class TestTraitsExecutorWithExternalWorkerPool( TestAssistant, TraitsExecutorTests, unittest.TestCase ): def setUp(self): TestAssistant.setUp(self) self._context = MultithreadingContext() self._worker_pool = self._context.worker_pool() self.executor = TraitsExecutor( context=self._context, event_loop=self._event_loop, worker_pool=self._worker_pool, ) self.listener = ExecutorListener(executor=self.executor) def tearDown(self): del self.listener self.executor.shutdown(timeout=SAFETY_TIMEOUT) del self.executor self._worker_pool.shutdown() del self._worker_pool self._context.close() del self._context TestAssistant.tearDown(self)
def test_run_until_success(self): # Trait fired, condition starts false but becomes true. executor = TraitsExecutor( context=MultithreadingContext(), event_loop=self._event_loop, ) # Case 1: condition true on second trait change event. future = submit_call(executor, slow_return) self.run_until( future, "state", condition=lambda future: future.done, ) self.assertTrue(future.done) # Case 2: condition true on the first trait firing. executor.stop() self.run_until( executor, "stopped", condition=lambda executor: executor.stopped, ) self.assertTrue(executor.stopped)
asyncio_future.set_result(traits_future.result) if sys.version_info < (3, 7): # We want to use get_running_loop, but it's new in Python 3.7. # This branch can be dropped once we can assume a minimum Python # version of 3.7. asyncio_future = asyncio.get_event_loop().create_future() else: asyncio_future = asyncio.get_running_loop().create_future() traits_future.observe(set_result, "done") return await asyncio_future def print_progress(event): """ Progress reporter for the π calculation. """ print(f"π is approximately {event.new:.6f}") if __name__ == "__main__": asyncio_event_loop = asyncio.new_event_loop() traits_executor = TraitsExecutor(event_loop=AsyncioEventLoop( event_loop=asyncio_event_loop)) traits_future = submit_iteration(traits_executor, approximate_pi) traits_future.observe(print_progress, "result_event") asyncio_event_loop.run_until_complete(future_wrapper(traits_future))
) plot.underlays.append(pi_line) # Allow extra room for the y-axis label. plot.padding_left = 100 return plot def default_traits_view(self): return View( HGroup( UItem("plot", editor=ComponentEditor()), VGroup( Item("chunk_size"), Item("max_points"), UItem("approximate", enabled_when="approximate_enabled"), UItem("cancel", enabled_when="cancel_enabled"), ), ), resizable=True, ) if __name__ == "__main__": traits_executor = TraitsExecutor() try: view = PiIterator(traits_executor=traits_executor) view.configure_traits() finally: traits_executor.shutdown()
def setUp(self): GuiTestAssistant.setUp(self) self.traits_executor = TraitsExecutor()
def __context_default(self): self._context_created = True return TraitsExecutor._TraitsExecutor__context_default(self)
def __message_router_default(self): self._message_router_created = True return TraitsExecutor._TraitsExecutor__message_router_default(self)