Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Asyncio HOWTO
- ## Очереди
- ```python
- import asyncio
- async def worker(q):
- while 1:
- x = await q.get()
- print('get', x)
- q.task_done()
- async def run():
- q = asyncio.Queue(10)
- print('wait worker')
- await worker(q) # await q.get() блокирует дальнейшее выполнение текущей сопрограммы
- for i in range(100):
- print('put', i)
- await q.put(i)
- if __name__ == '__main__':
- loop = asyncio.get_event_loop()
- try:
- loop.run_until_complete(run())
- finally:
- loop.close()
- print('finished')
- ```
- Зависает, выводит только `wait worker`.
- Переписываем с помощью паттерна `producer/consumer`:
- ```python
- import asyncio
- async def producer(q):
- for i in range(100):
- print('put', i)
- # Если очередь полна, сопрограмма будет ждать, пока появится свободное место
- await q.put(i)
- # Нужно как-то остановить consumer
- await q.put(None)
- async def consumer(q):
- # почему-то все ломает
- # while not q.empty():
- while 1:
- try:
- x = await q.get()
- print('get', x)
- if x is None:
- break
- finally:
- # Блок finally выполняется всегда даже после break и return
- q.task_done()
- async def run():
- q = asyncio.Queue(10)
- # Теперь у нас сопрограммы две и при блокировке первой, будет запущено выполнение другой
- await asyncio.wait([producer(q), consumer(q)])
- # Ждем пока очередь не станет пустой
- await q.join()
- if __name__ == '__main__':
- loop = asyncio.get_event_loop()
- try:
- loop.run_until_complete(run())
- finally:
- loop.close()
- print('finished')
- ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement