2010-10-21 56 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