Изучите приведенный ниже код, глава 18 из «Свободного питона» Лучано Рамальо, отличный ресурс по модулю asyncio. Кроме того, никогда не забывайте сами документы на https://docs.python.org/3/library/asyncio.html
#!/usr/bin/env python3
# spinner_asyncio.py
# credits: Example by Luciano Ramalho inspired by
# Michele Simionato's multiprocessing example in the python-list:
# https://mail.python.org/pipermail/python-list/2009-February/538048.html
import asyncio
import itertools
import sys
@asyncio.coroutine # <1>
def spin(msg):
write, flush = sys.stdout.write, sys.stdout.flush
for char in itertools.cycle('|/-\\'):
status = char + ' ' + msg
write(status)
flush()
write('\x08' * len(status))
try:
yield from asyncio.sleep(.1) # <3>
except asyncio.CancelledError: # <4>
break
write(' ' * len(status) + '\x08' * len(status))
@asyncio.coroutine
def slow_function(): # <5>
# pretend waiting a long time for I/O, Non-blocking call!
yield from asyncio.sleep(3) # <6>
return 42
@asyncio.coroutine
def supervisor(): # <7>
spinner = asyncio.async(spin('thinking!')) # <8>
print('spinner object:', spinner) # <9>
result = yield from slow_function() # <10>
spinner.cancel() # <11>
return result
def main():
loop = asyncio.get_event_loop() # <12>
result = loop.run_until_complete(supervisor()) # <13>
loop.close()
print('Answer:', result)
if __name__ == '__main__':
main()
1: сопрограммы, предназначенные для использования с asyncio, должны быть украшены @asyn
cio.coroutine. Это не обязательно, но настоятельно рекомендуется.
3: Использовать выход из asyncio.sleep (.1) вместо просто time.sleep (.1) для сна
без блокировки цикла событий.
4: Если asyncio.CancelledError вызывается после пробуждения вращения, это происходит потому, что
запрос отменен, поэтому выйдите из цикла.
5: slow_function является сопрограммой и использует yield from для запуска цикла событий
продолжайте, пока эта сопрограмма делает вид, что делает ввод / вывод, спя.
6: Выход из выражения asyncio.sleep (3) обрабатывает поток управления в
основной цикл, который возобновит эту сопрограмму после задержки сна.
7: супервизор также является сопрограммой, поэтому он может управлять медленной функцией с выходом
с.
8: asyncio.async (…) планирует запуск спин-сопрограммы, заключая ее в задачу
объект, который возвращается немедленно
9: Показать объект задачи. Вывод выглядит как Задача в ожидании coro = spin ()
работает на spinner_asyncio.py:12.
10: включите функцию slow_function (). Когда это будет сделано, получите возвращаемое значение.
Между тем цикл обработки событий продолжится, потому что slow_function
в конечном итоге использует yield из asyncio.sleep (3), чтобы передать управление обратно основному
цикл. * * 1 021
11: объект задачи можно отменить; это вызывает asyncio.CancelledError на выходе
линия, где сопрограмма в настоящее время приостановлена. Сопрограмма может поймать
исключение и задержка или даже отказ от отмены.
12: получить ссылку на цикл обработки событий.
13: довести сопрограмму супервизора до завершения; возвращаемое значение сопрограммы
Возвращаемое значение этого вызова.