1

我有一个建立在 asyncore 之上的第 3 方协议模块 (SNMP)。asyncore 接口用于处理响应消息。在异步主循环运行时设计生成协议请求端的客户端的正确技术是什么?我现在可以想到两个选择:

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

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

什么是最好的选择?我正在研究第二个解决方案,因为协议 API 没有让我直接访问异步参数。如果我误解了使用 asyncore 的正确技术,请纠正我。

4

1 回答 1

1

我通过在接收进程的异步循环中添加一个回调函数来解决这个问题。

该解决方案在某种程度上特定于我正在试验的模块(pySNMP),但这里是一般的想法:

  1. 定义一个函数闭包,它返回一个可调用的方法,其中存储了对 adictwindow变量的引用。dict跟踪预期响应,并且是发送方缓冲区的window大小。

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

  3. 将调度程序的超时设置为一个较小的值。这可以防止 asyncore 在等待接收到的数据包时阻塞太久。我用了 0.05 秒。你走的越低,你的应用程序的响应越多,但不要太低。

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

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

于 2010-04-29T03:45:05.043 回答