Python: Почему этот неблокирующий вызов блока recv? - PullRequest
0 голосов
/ 29 июля 2011

У меня есть следующий код в вызове потока $ init :

self.conn = copy.deepcopy(conn)
self.conn.setblocking(0)

conn является сокетом и передается в качестве аргумента в $ init Каждый поток получает уникальный сокет.В методе запуска у меня есть:

self.running = True
self.conn.send("Connected")
print self.name, "has a timeout of", self.conn.gettimeout()

while self.running:
    try:
        now = self.conn.recv(8192)
        print "Recieved:", now, "\n\tFrom:", self.name
        self.process(now)
    except socket.error:
         raise

     print "hi from", self.name
     time.sleep(1)

Тайм-аут печатается как 0.0, но «привет от имени потока» распечатывается только тогда, когда сообщение получено и исключение никогда не возникает!Похоже, что метод recv блокирует, но зачем это делать?

1 Ответ

1 голос
/ 29 июля 2011

Возможно, потому что recv читает из файла, а I / O блокирует?(сокеты тоже файлы, как вы, возможно, знаете):)

Смотрите здесь: python socket.recv / блокировка вызовов sendall для получения дополнительной информации:)

...