2013-10-17 42 views
1

我有一個連接,通過串行端口(是,串行端口,arduino,rf24卡等等)從自定義網絡協議發送和接收數據。如何編寫非阻塞代碼扭曲

我希望能夠做非阻塞代碼查詢串口等待響應數據包。 我已經知道我可以使用deferToThread,當我使用第三方庫時我無法修改,但事實並非如此,我可以修改代碼。我只想知道如何實現自己的非阻塞代碼,該代碼返回Deferred並稍後返回結果。

例如:ID爲1

  1. 發送信息包並等待ACK與相同的ID
  2. 繼續等待,同時用ID 1分組不是,可以在接收到的分組進行排隊
  3. 如果與ID信息包1被找到,返回結果,所以回調被稱爲「(關於冗餘的遺憾)

謝謝!

回答

1

基本思路如下:

id_to_deferred_map = {} 
def sendPacket(id, ...): 
    ... # write to transport 

    d = Deferred()   
    id_to_deferred_map[id] = d 
    return d 

# In protocol: 
def packetReceived(id, ...): 
    d = id_to_deferred_map[id] 
    del id_to_deferred_map[id] 
    d.callback() 

這應該給你一個想法。你只需要維護狀態來記住id的地圖並將它們映射到你發出的Deferred。當你收到一個數據包時,你獲取Deferred並用.callback()觸發它。

你必須填寫代碼來寫你的數據包,以及解析到達的數據包,獲取id並致電packetReceived

+0

好的答案 - 也許值得給一個在Twisted中使用串口傳輸的例子。 –