Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  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. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement