gpt4 book ai didi

Python3 asyncio - add_done_callback 的回调不会更新服务器类中的 self 变量

转载 作者:行者123 更新时间:2023-11-30 22:04:51 27 4
gpt4 key购买 nike

我有两个使用 asyncio.start_server 创建的服务器:asyncio.start_server(self.handle_connection, host = host, port = port) 并在一个循环中运行:

loop.run_until_complete(asyncio.gather(server1, server2))
loop.run_forever()

我正在使用 asyncio.Queue 在服务器之间进行通信。通过 queue.put(msg) 添加的来自 Server2 的消息成功被 Server1 中的 queue.get() 接收。我正在通过 asyncio.ensure_future 运行 queue.get() 并用作回调Server1 的 add_done_callback 方法:

def callback(self, future):
msg = future.result()
self.msg = msg

但是这个回调没有按预期工作 - self.msg 不会更新。我做错了什么?

已更新使用附加代码来显示最大完整示例:

class Queue(object):

def __init__(self, loop, maxsize: int):
self.instance = asyncio.Queue(loop = loop, maxsize = maxsize)

async def put(self, data):
await self.instance.put(data)

async def get(self):
data = await self.instance.get()
self.instance.task_done()
return data

@staticmethod
def get_instance():
return Queue(loop = asyncio.get_event_loop(), maxsize = 10)

服务器类别:

    class BaseServer(object):

def __init__(self, host, port):
self.instance = asyncio.start_server(self.handle_connection, host = host, port = port)

async def handle_connection(self, reader: StreamReader, writer: StreamWriter):
pass

def get_instance(self):
return self.instance

@staticmethod
def create():
return BaseServer(None, None)

接下来我将运行服务器:

loop.run_until_complete(asyncio.gather(server1.get_instance(), server2.get_instance()))
loop.run_forever()

在server2的handle_connection中我调用queue.put(msg),在server1的handle_connection中我注册queue.get()作为任务:

 task_queue = asyncio.ensure_future(queue.get())
task_queue.add_done_callback(self.process_queue)

server1的process_queue方法:

    def process_queue(self, future):
msg = future.result()
self.msg = msg

server1的handle_connection方法:

 async def handle_connection(self, reader: StreamReader, writer: StreamWriter):
task_queue = asyncio.ensure_future(queue.get())
task_queue.add_done_callback(self.process_queue)

while self.msg != SPECIAL_VALUE:
# doing something

虽然task_queue已完成,但self.process_queue被调用,self.msg永远不会更新。

最佳答案

基本上,由于您使用的是异步结构,我认为您可以直接等待结果:

async def handle_connection(self, reader: StreamReader, writer: StreamWriter):
msg = await queue.get()
process_queue(msg) # change it to accept real value instead of a future.
# do something

关于Python3 asyncio - add_done_callback 的回调不会更新服务器类中的 self 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com