Доброго вечера.
Достаточно глупый вопрос, даже стыдно.
Есть некая очередь с консьюмерами. В процессе обработки таска проводится проверка на соответствие некоторым условиям. В случае соответствия одному из них - дальнейшую обработку таска прерываем.
class Example:
def __init__(self):
pass
async def consumer(self, queue):
while True:
i = await queue.get()
k_list = [1, 2, 3]
for k in k_list:
if i == k:
queue.task_done()
# Как прекратить дальнейшую обработку этого таска?
await asyncio.sleep(3) # Псевдонагрузка
queue.task_done()
async def producer(self, queue):
for i in range(0, 100):
await queue.put(i)
async def run(self):
queue = asyncio.Queue()
consumers = [asyncio.ensure_future(self.consumer(queue)) for _ in range(10)]
producer = await self.producer(queue)
await queue.join()
for consumer_future in consumers:
consumer_future.cancel()
def start(self):
loop = asyncio.get_event_loop()
loop.run_until_complete(self.run())
if __name__ == '__main__':
Example = Example()
Example.start()
Сложность в блоке for. Как в окружении asyncio правильнее прервать дальнейшую обработку? break\continue не подходят, т.к. из while'а не выходим, return же при такой реализации подвесит весь поток.
Где я не там свернул?