Я ожидаю, что этот код в основном l oop является проблемой:
recv = conn.recv(661)
keys = pickle.loads(recv)
Функция сокета conn.recv()
будет блокировать до получения 661 байта, или там это некоторое событие сокета (например, закрытие). Таким образом, ваша программа блокирует каждую итерацию основного l oop в ожидании поступления данных.
Вы можете попробовать использовать socket.setblocking( False )
согласно руководству,
Однако я предпочитаю использовать модуль select
( ручная ссылка ), так как мне нравится лучший уровень контроля, который он дает. В основном вы можете использовать его, чтобы узнать, поступили ли какие-либо данные в сокет (или если есть ошибка). Это дает вам простой select-read-buffer type logi c l oop:
procedure receiveSocketData
Use select on the socket, with an immediate timeout.
Did select indicate any data arrived on my socket?
Read the data, appending it to a Rx-buffer
Does the Rx-buffer contain enough for a whole packet?
take the packet-chunk from the head of the Rx-buffer
decode & return it
Else
Keep the Rx-Buffer somewhere safe
return None
Did any errors happen on my socket
clear Rx-Buffer
close socket
return error
Я думаю, используя пакет неизвестного размера, вы можете попытаться отменить его и вернуть OK когда успешно ... это довольно неэффективно, хотя. Я бы использовал пакет фиксированного размера и модуль struct
, чтобы упаковать и распаковать его в сетевом порядке байтов.