2010-04-13 69 views
1

我有一个构建在asyncore之上的第三方协议模块(SNMP)。 asyncore接口用于处理响应消息。在asyncore主循环运行时,设计生成协议请求端的客户端的正确方法是什么?我能想到的两种选择现在:使用Python构建SNMP请求响应服务Asyncore

  1. 使用循环,asyncore.loop()的超时参数,让我的客户端程序的时间发送适当的请求。

  2. 创建一个客户端asyncore调度器,它将在与接收器相同的asyncore处理循环中执行。

什么是最佳选择?我正在研究第二种解决方案,导致协议API不能直接访问asyncore参数。如果我误解了使用asyncore的正确技术,请纠正我。

回答

1

我通过在接收器进程的asyncore循环中添加回调函数来解决此问题。

将溶液稍微特定于模块我是实验(pySNMP),但这里的总体思路是:

  1. 定义一个函数闭合返回一个可调用的方法与存储的参照dictwindow变量。 dict跟踪预期的响应,并且window是发送方缓冲区的大小。

  2. 将对闭包函数的引用传递给定制的asyncore.dispatcher实例。回调函数可以在writeable方法调用中执行。

  3. 将调度程序的超时设置为较小的值。这可以防止等待接收的数据包时异步阻塞时间过长。我用了0.05秒。越低,你的应用程序响应越多,但不要太低。

  4. 更新asyncore read_handle方法以从您的全局dict结构中删除收到的响应。这将允许传输新消息。

  5. 现在启动调度程序和asyncore的每个循环,系统将调用回调函数并发送任何消息,直至定义的窗口大小。