Я изучаю синтаксис Python await / async и удивляюсь, как сопрограмма может быть реализована без асинхронного, await или yield.Например, я сделал этот простой трехсекундный таймер с синтаксисом async def:
import asyncio
async def coroutine():
count = 0
while count < 3:
count += 1
print(count)
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(coroutine())
loop.close()
Результат:
1
2
3
Я заметил, что мы можем реализовать объект Coroutine, реализовав __await__
(https://docs.python.org/3.6/reference/datamodel.html#awaitable-objects). Так что я могу успешно удалить await
.
import asyncio
class Generator():
def __await__(self):
count = 0
while count < 3:
count += 1
print(count)
yield from asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(Generator())
loop.close()
Наконец, я хочу реализовать итератор без выхода, как это:
import asyncio
class Iterator():
def __init__(self):
self.count = 0
def __iter__(self): return self
def __await__(self): return self
def __next__(self):
if self.count < 3:
self.count += 1
print(self.count)
return next(asyncio.sleep(1))
else:
raise StopIteration()
loop = asyncio.get_event_loop()
result = loop.run_until_complete(Iterator())
loop.close()
Но это не такне работает. Он останавливается после того, как показывает «1».
Я знаю, что это не имеет никакого практического значения, но я хочу знать, как правильно понимать asyncio. Могу ли я реализовать сопрограмму без ожидания или выхода«Если так, то как это сделать?» Я протестировал это на Python 3.6.7.