2010-10-21 51 views
1

爲了在python中實現一個簡單的協議,我使用了一個線程來監視接收器發送的確認。要做到這一點,我使用一個線程函數在Python中的線程中終止sockert.recv

def ackListener(self): 

    while self.waitingforack: 
     ack = self.socket_agent.recv(4) 
     ... 
    exit() 

其中self.waitingforack是布爾我設置爲False,當我收到的確認,我發送的每個消息。

的問題是,我的代碼是阻止在self.socket_agent.recv(4)運行,waitingforack值的修改完成太晚

有沒有辦法迫使線程時,我沒有在等待ACK終止了嗎?

謝謝

回答

2

記住,像recv的這些操作,你的情況是阻塞操作。 所以調用這個功能塊,除非你已經收到數據。

有兩種方法去做:

建立套接字非阻塞

socket.setblocking(0) 

設置超時值 見:http://docs.python.org/library/socket.html#socket.socket.settimeout

socket.settimeout(value) 

使用異步方法

+0

謝謝你似乎setblocking和setTimeout的可以幫助我。問題是,我只想在我發送每條消息的時候修改阻塞或超時值(這是我在recv操作中已經被阻塞的時候)... – 2010-10-21 23:42:58

+1

@Martin Trigaux:如上所述,如果你已經叫recv,你會被阻止。您應該設置爲非阻塞或減少鎖定超時並圍繞它設計解決方案。 – pyfunc 2010-10-22 00:02:40