...当asyncio将处理第二个等待时,在我的HTTPX_GET函数中,res2=await client.get(..).
在第一次等待时,事件循环将暂停该任务,并继续执行其他操作,最终判断是否返回client.get
.如果有,则该任务将继续执行,直到它遇到第二个等待resp2 =await...
,Eventloop像第一个一样处理该第二个await
-它挂起该任务并继续做其他事情,直到它判断协程是否已经返回.
这里有一个用时间延迟代替检索url的例子--希望它是类似的,并将显示您的流程的情况可能如何发展.
import asyncio,random,time
async def httpx_get(client, url):
print(f'{time.time()} task:{client} resp1 will be called')
resp1 = await asyncio.sleep(random.randrange(1,10))
# ... other computation ...
print(f'{time.time()} task:{client} resp1 returned')
print(f'{time.time()} task:{client} executing')
print(f'{time.time()} task:{client} executing')
print(f'{time.time()} task:{client} executing')
print(f'{time.time()} task:{client} executing')
print(f'{time.time()} task:{client} resp2 will be called')
resp2 = await asyncio.sleep(random.randrange(1,10))
print(f'{time.time()} task:{client} resp2 returned')
return f'{time.time()} task:{client} finished - url'
async def fetch_pages(urls):
# create task for all URLs
coros = []
for n,url in enumerate(urls):
coros.append(asyncio.create_task(httpx_get(n, url)))
# await all tasks
for coro in asyncio.as_completed(coros):
resp = await coro
print(f'{time.time()} {resp}')
def main():
urls = [ "https://google.com", "https://yahoo.com", "https://youtube.com" ]
asyncio.run(fetch_pages(urls))
if __name__ == "__main__":
main()
执行死刑的结果:
1659744155.1480112 task:0 resp1 will be called and awaited
1659744155.1480112 task:1 resp1 will be called and awaited
1659744155.1480112 task:2 resp1 will be called and awaited
1659744161.152556 task:2 resp1 returned
1659744161.152556 task:2 executing
1659744161.152556 task:2 executing
1659744161.152556 task:2 executing
1659744161.154198 task:2 executing
1659744161.154198 task:2 resp2 will be called and awaited
1659744163.1660972 task:1 resp1 returned
1659744163.1660972 task:1 executing
1659744163.1660972 task:1 executing
1659744163.1660972 task:1 executing
1659744163.1660972 task:1 executing
1659744163.1675234 task:1 resp2 will be called and awaited
1659744164.1542242 task:0 resp1 returned
1659744164.1542242 task:0 executing
1659744164.1542242 task:0 executing
1659744164.1542242 task:0 executing
1659744164.155838 task:0 executing
1659744164.155838 task:0 resp2 will be called and awaited
1659744166.167943 task:2 resp2 returned
1659744166.167943 1659744166.167943 task:2 finished - https://youtube.com
1659744168.1679864 task:1 resp2 returned
1659744168.1685212 1659744168.1685212 task:1 finished - https://yahoo.com
1659744169.1565957 task:0 resp2 returned
1659744169.1565957 1659744169.1565957 task:0 finished - https://google.com