【发布时间】:2015-07-10 14:06:11
【问题描述】:
我有一堆协程在做一些工作
@asyncio.coroutine
def do_work():
global COUNTER
result = ...
if result.status == 'OK':
COUNTER += 1
还有一个
COUNTER = 0
@asyncio.coroutine
def display_status():
while True:
print(COUNTER)
yield from asyncio.sleep(1)
必须显示有多少协程完成了他们的工作。如何正确执行此任务?以下解决方案不起作用
@asyncio.coroutine
def spawn_jobs():
coros = []
for i in range(10):
coros.append(asyncio.Task(do_work()))
yield from asyncio.gather(*coros)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.create_task(display_status())
loop.run_until_complete(spawn_jobs())
loop.close()
我希望无论 do_work() 协程做什么,计数器都会每秒打印到控制台。但我只有两个输出:0 和几秒钟后重复 10。
【问题讨论】:
-
一种可能的选择是将 print(COUNTER) 添加到
do_work()函数中,但我希望每秒打印一次COUNTER而不是在完成工作后 -
“不起作用”不是很具体。你期望会发生什么?会发生什么?
-
不要在 cmets 中添加其他信息,edit 你的问题。
-
不相关:使用
asyncio.create_task()而不是asyncio.Task()。此外,在这种情况下,您可能都不需要:yield from asyncio.wait([do_work() for _ in range(10)])按原样工作。
标签: python python-3.x asynchronous coroutine