使用Python进行异步和等待
我以前在C#中使用过async/await,就像在中一样,但这是一个概念,我需要时不时地进行更新 这次我在使用Python,但这个问题更多的是关于Async Await的概念,而不是实现 基本上我有一个服务器,我向它发送请求,这个服务器发送响应。如果我只有一次使用Python进行异步和等待,python,asynchronous,async-await,Python,Asynchronous,Async Await,我以前在C#中使用过async/await,就像在中一样,但这是一个概念,我需要时不时地进行更新 这次我在使用Python,但这个问题更多的是关于Async Await的概念,而不是实现 基本上我有一个服务器,我向它发送请求,这个服务器发送响应。如果我只有一次 async def send_and_get_response(self,request): self.remote_server.send_request(request) response= await self.remo
async def send_and_get_response(self,request):
self.remote_server.send_request(request)
response= await self.remote_server.get_response()
return response
没问题
但是,假设我不想向服务器发送一个请求,而是要向服务器发送几个请求,并且我想等待响应。我不想在收到回复后发送一个请求,而是一次发送所有请求。我也不想错过回复
如果我错了,请纠正我的错误,但是async/await的本质是,如果我在await之后放置代码,那么在等待完成之前,该代码不会被执行,对吗
这样做不对吗
我想在上述情况下,request2只有在响应1到达后才会被发送,我错了吗
那怎么办呢?我的想法是
async def send_and_get_response(self,request1,request2):
self.remote_server.send_request(request1)
self.remote_server.send_request(request2)
response1= await self.remote_server.get_response()
response2= await self.remote_server.get_response()
return [response1,response2]
但不知何故,这感觉并不正确。如果响应1在我可以等待之前立即到达呢?如果response2比response1早到呢
那么这个呢:
async def send_and_get_response(self,request):
self.remote_server.send_request(request)
response= await self.remote_server.get_response()
return response
response1=send_and_get_response(request1)
response2=send_and_get_response(request2)
这样行吗
我重复一遍,我想完成的是向服务器发送两个(或更多)请求,并等待所有请求的响应。它们可以有不同的顺序
编辑
这个怎么样
async def send_and_get_response(self,request):
self.remote_server.send_request(request)
response= await self.remote_server.get_response()
return response
results= await asyncio.gather(
send_and_get_response(request1),
send_and_get_response(request2),
send_and_get_response(request3),
)
这样行吗?如果有,我如何得到回应
编辑2
我已经检查了其他,我想知道如何使以下工作
async def process_when_done(tasks):
for res in asyncio.as_completed(tasks):
print("Result %s" % await res)
tasks2= [ send_and_get_response(request1),
send_and_get_response(request2),
send_and_get_response(request3)]
process_when_done(tasks2)
在这种情况下,我试图在每个过程完成后立即处理它
我想在上述情况下,request2只有在响应1到达后才会被发送,我错了吗
你说得对
但不知何故,这感觉并不正确。如果响应1在我可以等待之前立即到达呢?如果response2比response1早到呢
这可能是对的,因为您希望等待所有响应(这意味着您实际上在等待最长的响应)。如果您需要立即对响应执行某些操作,则可能不正确:
async def send_and_get_response(self,request1,request2):
self.remote_server.send_request(request1)
self.remote_server.send_request(request2)
response1= await self.remote_server.get_response()
# do something here with response1
# if response2 arrives first, then we are wasting time.
response2= await self.remote_server.get_response()
# do something here with response2
return [response1,response2]
这样行吗
不,send\u和\u get\u response
是一个异步函数,您需要等待send\u和\u get\u response
,或者什么也不做,但是如果您等待它,那么与第一个实现没有区别
实际上,我们在Python中就是为了这个目的而使用的。我明白了,所以最后一个将不起作用。我现在明白了;(我会检查你的链接,但是你知道如何做我想做的事情吗?你的第二个实现实际上是有效的。或者你可以按照链接使用一种更具python风格的方式。我又添加了一次使用
asyncio.gather
的尝试。你能看一下吗?是的,这很有意义。“结果值的顺序对应于aws中可等待项的顺序。”请参阅文档。
async def send_and_get_response(self,request1,request2):
self.remote_server.send_request(request1)
self.remote_server.send_request(request2)
response1= await self.remote_server.get_response()
# do something here with response1
# if response2 arrives first, then we are wasting time.
response2= await self.remote_server.get_response()
# do something here with response2
return [response1,response2]