你可以用
asyncio.all_tasks()
但这样做可能是错误的。
call_later
将它们标记为已完成:
import asyncio
from functools import partial
START_RATE = 1
def say_hi(who):
print(f'hello {who}')
def run_on_finish(callback):
def wrapper(func, *args, **kwargs):
try:
return func(*args, **kwargs)
finally:
callback()
return wrapper
def release_waiter(waiter, *args):
"""Taken from standard library"""
if not waiter.done():
waiter.set_result(None)
def run():
# Let's go!
incr = START_RATE
loop = asyncio.get_event_loop()
tasks = []
for x in range(5):
wait_delta = 5 - x
# Create a waiter
waiter = loop.create_future()
release_cb = partial(release_waiter, waiter)
# Schedule the function, making sure we release the waiter on finish
handle = loop.call_later(incr * wait_delta, run_on_finish(release_cb),
say_hi, x)
# If waiter is cancelled, cancel the handle too.
waiter.add_done_callback(lambda *args: handle.cancel)
tasks.append(waiter)
loop.run_until_complete(asyncio.gather(*tasks))
run()
待会儿打电话给你
用于正常函数而不是协程。如果
say_hi
ensure_future
或
loop.create_task
加入混音。
添加它们确实会带来更多的复杂性-您需要添加更多的函数
确保未来
的结果,并以类似的方式与你的服务员连锁
futures._chain_future
.
我强烈建议在这种情况下使用你自己的协同程序,就像你已经做的那样。