在Python中的线程中终止socket.recv

时间:2010-10-21 17:14:12

标签: python multithreading sockets

为了在python中实现一个简单的协议,我使用了一个线程来监视接收者发送的确认。为此,我在函数中使用了一个线程

def ackListener(self):

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

其中self.waitingforack是一个布尔值,当我收到对我发送的每封邮件的确认时,我设置为False

问题是我的代码在self.socket_agent.recv(4)操作时阻塞,waitingforack的值修改太晚了

当我不再等待ack时,有没有办法强制Thread终止?

谢谢

1 个答案:

答案 0 :(得分:3)

请记住,像recv这样的操作在你的情况下是阻塞操作。 因此,除非您已收到数据,否则调用此函数块。

有两种方法可以解决这个问题:

使套接字无阻塞

socket.setblocking(0)

设置超时值 见:http://docs.python.org/library/socket.html#socket.socket.settimeout

socket.settimeout(value)

使用异步方法