python return done'_add\u done\u callback的Python3异步回调不更新服务器类中的自变量

我有两个服务器,用异步服务器启动\:

asyncio.start_server(self.handle_connection, host = host, port = port)并在一个循环中运行:loop.run_until_complete(asyncio.gather(server1, server2))

loop.run_forever()

我在用异步队列在服务器之间进行通信。通过queue.put(msg)添加的来自Server2的消息由Server1中的queue.get()成功接收。我正在运行queue.get(),并将其用作

add_done_callback来自服务器1的方法:

^{2}$

但是这个callback没有按预期工作-自我.msg不要更新。我做错什么了?在

更新

用附加代码显示max完整示例: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中,我注册了{}作为任务: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从不更新。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值