SHARE
TWEET

Untitled

a guest Oct 23rd, 2019 65 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Asyncio HOWTO
  2.  
  3. ## Очереди
  4.  
  5. ```python
  6. import asyncio
  7.  
  8.  
  9. async def worker(q):
  10.   while 1:
  11.     x = await q.get()
  12.     print('get', x)
  13.     q.task_done()
  14.  
  15.  
  16. async def run():
  17.   q = asyncio.Queue(10)
  18.   print('wait worker')
  19.   await worker(q)  # await q.get() блокирует дальнейшее выполнение текущей сопрограммы
  20.   for i in range(100):
  21.     print('put', i)
  22.     await q.put(i)
  23.  
  24.  
  25. if __name__ == '__main__':
  26.   loop = asyncio.get_event_loop()
  27.  
  28.   try:
  29.     loop.run_until_complete(run())
  30.   finally:
  31.     loop.close()
  32.  
  33.   print('finished')
  34. ```
  35.  
  36. Зависает, выводит только `wait worker`.
  37.  
  38. Переписываем с помощью паттерна `producer/consumer`:
  39.  
  40. ```python
  41. import asyncio
  42.  
  43.  
  44. async def producer(q):
  45.   for i in range(100):
  46.     print('put', i)
  47.     # Если очередь полна, сопрограмма будет ждать, пока появится свободное место
  48.     await q.put(i)
  49.   # Нужно как-то остановить consumer
  50.   await q.put(None)
  51.  
  52. async def consumer(q):
  53.   # почему-то все ломает
  54.   # while not q.empty():
  55.   while 1:
  56.     try:
  57.       x = await q.get()
  58.       print('get', x)
  59.       if x is None:
  60.         break
  61.     finally:
  62.       # Блок finally выполняется всегда даже после break и return
  63.       q.task_done()
  64.  
  65.  
  66. async def run():
  67.   q = asyncio.Queue(10)
  68.   # Теперь у нас сопрограммы две и при блокировке первой, будет запущено выполнение другой
  69.   await asyncio.wait([producer(q), consumer(q)])
  70.   # Ждем пока очередь не станет пустой
  71.   await q.join()
  72.  
  73.  
  74. if __name__ == '__main__':
  75.   loop = asyncio.get_event_loop()
  76.  
  77.   try:
  78.     loop.run_until_complete(run())
  79.   finally:
  80.     loop.close()
  81.  
  82.   print('finished')
  83. ```
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top