class BaseEthServiceWorker: def __init__(self, handlers, *, queue_name): self._handlers = handlers or [] self._queue_name = queue_name self.worker = None def work(self): return asyncio.get_event_loop().create_task(self._work()) async def _work(self): await prepare_database(handle_migration=False) redis = await prepare_redis() self.worker = Worker(self._handlers, queue_name=self._queue_name, connection=redis) self.worker.work() def shutdown(self): return self.worker.shutdown() def add_task_handler(self, cls, args=None, kwargs=None): if self.worker is None: self._handlers.append((cls, args or [], kwargs or {})) else: self.worker.add_task_handler(cls, args=args, kwargs=kwargs)
async def _work(self): await prepare_database(handle_migration=False) redis = await prepare_redis() self.worker = Worker(self._handlers, queue_name=self._queue_name, connection=redis) self.worker.work()
async def test_workers_with_different_queues(redis): with Worker([(Handler1, )], queue_name="q1"), Worker([(Handler2, { 'a': 1, 'b': 2 })], queue_name="q2"): d1 = Dispatcher(queue_name="q1") d2 = Dispatcher(queue_name="q2") with pytest.raises(TaskError): p = await d1.get_vals() print(p) result = await d1.do_some_work(1, 2, c=3) assert result == [1, 2, 3] result = await d2.get_vals() assert result == {'a': 1, 'b': 2}
async def test_handler_with_kargs(redis): with Worker([(Handler2, {'b': 2})]): d = Dispatcher() task = d.get_vals() result = await task assert result == {'a': None, 'b': 2}
async def test_simple_worker(redis): with Worker([Handler1]): d = Dispatcher() task = d.do_some_work(1, 2, c=3) result = await task assert result == [1, 2, 3]
async def test_redis_disconnects_3(redis): with Worker([Handler1]): d1 = Dispatcher() redis.pause() t = d1.slow_task() await asyncio.sleep(0.5) redis.start() result = await t assert result == 1
async def test_redis_disconnects(redis): with Worker([Handler1]): d1 = Dispatcher() result = await d1.do_some_work(1, 2, c=3) assert result == [1, 2, 3] redis.pause() await asyncio.sleep(0.1) redis.start() result = await d1.do_some_work(1, 2, c=3) assert result == [1, 2, 3]