我是Python新手,代码如下所示:
import time
import asyncio
async def my_async_function(i):
print("My function {}".format(i))
async def start():
requests = []
# Create multiple requests
for i in range(5):
print("Creating request #{}".format(i))
requests.append(my_async_function(i))
# Do some additional work here
print("Begin sleep")
time.sleep(10)
print("End sleep")
# Wait for all requests to finish
return await asyncio.gather(*requests)
asyncio.run(start())
无论“额外工作”需要多长时间,请求似乎只在“结束睡眠”之后运行。我猜asyncio.gather
才是真正开始执行它们的地方。我怎样才能让请求(akamy_async_function()
)立即开始,做额外的工作,然后等待所有请求在最后完成
编辑: 根据Krumelur的评论和我自己的发现,我所寻找的结果如下:
import time
import asyncio
import random
async def my_async_function(i):
print("Begin function {}".format(i))
await asyncio.sleep(int(random.random() * 10))
print("End function {}".format(i))
async def start():
requests = []
# Create multiple requests
for i in range(10):
print("Creating request #{}".format(i))
requests.append(asyncio.create_task(my_async_function(i)))
# Do some additional work here
print("Begin sleep")
await asyncio.sleep(5)
print("End sleep")
# Wait for all requests to finish
return await asyncio.gather(*requests)
asyncio.run(start())
只有当my_async_function
和“额外工作”都是等待的,这样事件循环才能给它们中的每一个提供执行时间时,这才有效。您需要create_task
(如果您知道它是一个协同路由)或ensure_future
(如果它可能是一个协同路由或未来)来允许请求立即运行,否则它们仍然只有在您gather
时才会运行
time.sleep()
是一个同步操作您需要使用异步睡眠并等待它, 例如
其他异步代码将仅在当前任务产生时运行(即,通常在“等待”某些内容时)
使用异步代码意味着您必须随时随地使用异步。异步操作适用于I/O绑定的应用程序。如果“额外工作”主要受CPU限制,那么最好使用线程(但要注意全局解释器锁!)
相关问题 更多 >
编程相关推荐