使用Python Asyncore构建SNMP请求-响应服务
我有一个第三方的协议模块(SNMP),它是基于asyncore构建的。asyncore接口用于处理响应消息。现在我想设计一个客户端,让它在asyncore的主循环运行时能够生成请求。现在我想到两个方法:
使用asyncore.loop()中的循环和超时参数,这样我的客户端程序就能有时间发送合适的请求。
创建一个客户端的asyncore调度器,让它和接收器在同一个asyncore处理循环中执行。
哪种方法更好呢?我正在研究第二种解决方案,因为这个协议的API没有直接让我访问asyncore的参数。如果我对使用asyncore的正确方法有误解,请指正我。
1 个回答
1
我通过在接收进程的asyncore循环中添加一个回调函数来解决这个问题。
这个解决方案有点针对我正在实验的模块(pySNMP),但这里是大致的思路:
定义一个函数闭包,这个闭包返回一个可调用的方法,并且里面存储了一个
dict
和一个window
变量。这个dict
用来跟踪预期的响应,而window
则是发送者缓冲区的大小。将这个闭包函数的引用传递给一个定制的asyncore.dispatcher实例。回调函数可以在
writeable
方法被调用时执行。将dispatcher的超时时间设置得小一些。这可以防止asyncore在等待接收到的数据包时阻塞太久。我设置的是0.05秒。时间设置得越低,你的应用响应越快,但也不要设置得太低。
更新asyncore的read_handle方法,以便从全局的
dict
结构中移除已接收到的响应。这样可以让新的消息得以传输。现在启动dispatcher,每次asyncore循环时,系统都会调用回调函数,并发送任何消息,直到达到定义的窗口大小。