是否可以独立于另一个循环运行异步while循环?
我在以下示例代码
中分离了我遇到的问题,而不是实际的代码import asyncio, time
class Time:
def __init__(self):
self.start_time = 0
async def dates(self):
while True:
t = time.time()
if self.start_time == 0:
self.start_time = t
yield t
await asyncio.sleep(1)
async def printer(self):
while True:
print('looping') # always called
await asyncio.sleep(self.interval)
async def init(self):
async for i in self.dates():
if i == self.start_time:
self.interval = 3
await self.printer()
print(i) # Never Called
loop = asyncio.get_event_loop()
t = Time()
loop.run_until_complete(t.init())
有没有办法让打印功能独立运行,每次调用print(i)
?
它应该做的是print(i)
每秒,每3秒调用self.printer(i)
本质上,self.printer是一个单独的任务,不需要经常调用,只需每隔x
秒(在本例中为3)。
在JavaScript中,解决方案是做类似的事情
setInterval(printer, 3000);
编辑:理想情况下,如果调用条件或停止函数,也可以取消/停止self.printer
答案 0 :(得分:2)
JavaScript asyncio
的{{1}}等价物为setTimeout
:
asyncio.ensure_future
答案 1 :(得分:0)
您希望将self.printer()
协程注册为单独的任务;将其传递给asyncio.ensure_future()
而不是直接等待它:
asyncio.ensure_future(self.printer())
通过将协同程序传递给asyncio.ensure_future()
,您可以将它放在循环之间切换的事件列表中,因为每个事件都要等待进一步的工作完成。
通过该更改,您的测试代码输出:
1516819094.278697
looping
1516819095.283424
1516819096.283742
looping
1516819097.284152
# ... etc.
任务是多线程场景中的asyncio等效线程。