Обратите внимание, что EWOULDBLOCK - это номер ошибки 11:
In [80]: import errno
In [83]: errno.EWOULDBLOCK
Out[84]: 11
И соответствующее сообщение об ошибке:
In [86]: import os
In [87]: os.strerror(errno.EWOULDBLOCK)
Out[89]: 'Resource temporarily unavailable'
Вот некоторый игрушечный код, который отображает ошибку EWOULDBLOCK.Он устанавливает сервер и клиент, которые пытаются общаться друг с другом через сокетное соединение.Когда s.setblocking(0)
вызывается для перевода сокета в неблокирующий режим, последующий вызов s.recv
поднимает socket.error
.Я думаю, что это происходит, потому что оба конца соединения пытаются получить данные:
import socket
import multiprocessing as mp
import sys
import time
def server():
HOST='localhost'
PORT=6000
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr=s.accept()
while True:
data=conn.recv(1024)
if data:
conn.send(data)
conn.close()
def client():
HOST='localhost'
PORT=6000
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.setblocking(0) # Comment this out, and the EWOULDBLOCK error goes away
s.send('Hello, world')
try:
data=s.recv(1024)
except socket.error as err:
print(err)
# [Errno 11] Resource temporarily unavailable
sys.exit()
finally:
s.close()
print('Received {0}'.format(repr(data)))
def run():
server_process=mp.Process(target=server)
server_process.daemon=True
server_process.start()
time.sleep(0.1)
client()
run()
Если s.setblocking(0)
закомментирован, вы должны увидеть
Received 'Hello, world'