使用Python进行异步和等待

使用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

我以前在C#中使用过async/await,就像在中一样,但这是一个概念,我需要时不时地进行更新

这次我在使用Python,但这个问题更多的是关于Async Await的概念,而不是实现

基本上我有一个服务器,我向它发送请求,这个服务器发送响应。如果我只有一次

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]