Python 令人困惑的问题,asyncio与循环中的循环
我正在尝试开发一种“反向代理”类型的东西,我几乎完成了。然而,我遇到了一个问题。我有两台服务器。运行实际源的主服务器(服务器A)和客户端将连接到的代理服务器(服务器B) 基本上,我的设计如下: 客户端连接到服务器B(代理服务器)后Python 令人困惑的问题,asyncio与循环中的循环,python,sockets,asynchronous,python-asyncio,Python,Sockets,Asynchronous,Python Asyncio,我正在尝试开发一种“反向代理”类型的东西,我几乎完成了。然而,我遇到了一个问题。我有两台服务器。运行实际源的主服务器(服务器A)和客户端将连接到的代理服务器(服务器B) 基本上,我的设计如下: 客户端连接到服务器B(代理服务器)后 客户端开始向服务器B发送数据包 服务器B将其数据包发送到服务器A 服务器A接收他们的数据包,对其进行适当的解析(这是实际的源),然后将响应数据包发送回服务器B 服务器B从服务器A接收数据包响应,并将其发送回客户端 到目前为止,它运行良好。然而,有一个主要问题。异步循环
导入异步IO
asyncio.run(server.loop())
然后这就是实际的循环(这是一个较长的文件,但我删除了冗余信息):
async def循环(self):
self.server=wait asyncio.start_server(self.init,self.settings['proxy']['host'],self.settings['proxy']['ports']][self.type])
与self.server异步:
打印(“~Listening@{%s:%s}”%(self.settings['proxy']['host'],str(self.settings['proxy']['ports'][self.type]))
打印()
等待self.server.start_服务()
等待自我。服务器。永远为你服务()
异步定义初始化(self、r、w):
等待客户端(self、r、w).connect()
正如您所看到的,它调用一个客户机类,该客户机类包含实际代理文件的循环。它从客户端接收数据包,将其发送到服务器A,接收服务器A的响应,然后将其发送回客户端。这是客户端类(已删除冗余信息)
异步def连接(自):
self.ip=self.w.get_extra_info('peername'))
self.tag=(“[%s:%s]”%(self.ip[0],str(self.ip[1]))
self.dest['r'],self.dest['w']=等待异步IO.open_连接(host=self.host,port=self.port)
打印(“新客户端::%s”%(self.tag))
而(不是self.w.正在关闭()):
尝试:
数据=等待self.r.readuntil(分隔符=b'\x00')
如果数据:
等待自我转发(数据)
其他:
等待self.disconnect()
除asyncio.UncompleteReadError外:
等待self.disconnect()
异步def转发(自身、数据):
#数据=数据。解码(“utf-8”)[:-1]
打印(“RECV_DEST::%s=>%s”%(self.tag,data.decode(“utf-8”)[:-1]))
如果数据:
self.w.write(数据)
异步def断开连接(自):
打印(“[断开客户端]:%s:%s”%(self.ip[0],str(self.ip[1]))
self.w.close()
到目前为止,一切正常。客户端将数据包发送到此代理文件(服务器B),数据包发送到主源(服务器a),主源将数据包发送回代理文件(服务器B),然后服务器B将服务器a的响应发送回客户端。它是一个有效的代理脚本
问题:使用此反向代理,我一次只能从主服务器a接收一行。因此,基本上,如果客户端发送服务器B 1数据包,则此远程代理仅从服务器a读取1个响应数据包,即使服务器a发回多个响应数据包。所以基本上,我一次只能读取一行,在forward()
函数中
我真的不知道该怎么做,除了在阅读过程中做另一个循环?我不知道我该怎么做。也许可以使用
run\u-in\u-executor
?只是一个提示:您几乎肯定不需要另一个循环,也不需要run\u-in\u-executor
。您可能需要asyncio.create_task()
来创建多个并行工作的协同程序。只是一个提示:您几乎肯定不需要另一个循环,也不需要run_in_executor
。您可能需要asyncio.create_task()
来创建多个并行工作的协同程序。