2010-04-13 67 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的每個循環,系統將調用回調函數併發送任何消息,直至定義的窗口大小。