我有一个基于asyncore的第三方协议模块(SNMP)。异步接口用于处理响应消息。在异步主循环运行时,设计客户端以生成协议的请求方的正确技术是什么?我现在可以想到两个选择:
使用asyncore.loop()的loop,timeout参数允许我的客户端程序时间发送适当的请求。
创建一个客户端异步分发程序,该分发程序将在与接收者相同的异步处理循环中执行。
最好的选择是什么?我正在研究第二种解决方案,因为协议API无法直接访问asyncore参数。如果我误解了使用异步方法的正确技术,请纠正我。
最佳答案
我通过将回调函数添加到接收器进程的异步循环中来解决此问题。
该解决方案在某种程度上特定于我正在尝试的模块(pySNMP),但这是基本思路:
定义一个函数闭包,该闭包返回带有存储的对dict
和window
变量的引用的可调用方法。 dict
跟踪预期的响应,而window
是发送方缓冲区的大小。
将对闭包函数的引用传递到自定义的asyncore.dispatcher实例中。回调函数可以在writeable
方法调用中执行。
将调度程序的超时设置为较小的值。这样可以防止异步接收器在等待接收到的数据包时阻塞时间过长。我用了0.05秒。您走得越低,应用程序的响应就越多,但不要太低。
更新asyncore read_handle方法以从全局dict
结构中删除收到的响应。这将允许发送新消息。
现在启动调度程序和异步的每个循环,系统将调用回调函数,并发送任何消息,直到定义的窗口大小为止。