Вот основная идея потоков, которые я создаю в моей программе:Добавление time.sleep в многопоточной программе решает UnicodeDecodeError в питона
Main thread
|
ListenerCreator(The WebSocketServer thread) ---> Several listener threads(using log())
Таким образом, основной поток создает ListenerCreator нить, которая соединяет для нескольких клиентов и создает поток слушателей для каждого клиента. Вот кратко, что происходит в потоке слушателя: EDIT1: Я использую WebSockets для чтения/записи данных с моего клиента. Для этого я создал свой собственный сервер. Существует framing protocol, который стандарт указывает - и я использую это. На стороне клиента я просто использую WebSocket.send() и «разоблачая» сообщения в соответствии с инструкциями, приведенными в протоколе (см. Раздел 5.3 в приведенной выше ссылке). я был бы готов предоставить код сервера, если кто-то просит его, однако, вот краткое описание:
class WebSocketServer:
def start():
#Open server socket, bind to host:port
while True:
#Accept client socket, start a new listener thread for self.log(client)
def log(client):
#Receive data using socket.socket.recv(1024)
#Unmask data as per the protocol
#Decode using data.decode("utf-8")
#Append to data_q while holding data_q_lock
Существуют и другие методы - те, для облегчения отправки, закрытия, рукопожатия и так далее.
Между тем в главном потоке:
while breaking!=len(client_list):
#time.sleep(0.5)
with data_q_lock:
for i in range(len(data_q)):
mes = data_q.pop()
for m in client_list:
if "#DONE"== mes:
breaking += 1
if(mes[:len("#COUNT:")] == "#COUNT:"):
print(mes)
Поэтому в основном то, что делает этот цикл является: Петля через в data_q, если сообщение начинается с «#COUNT», напечатать сообщение, и после получения определенного количества из сообщений «#DONE», выйдите из цикла. Если time.sleep раскомментирован, тогда этот код работает, однако без time.sleep я получаю UnicodeDecodeError в log. Также я получаю ошибку иногда, иногда программа работает отлично. (Клиент посылает одни и те же данные каждый раз, между прочим) Итак, мой вопрос: почему требуется время. Я думал, что это что-то связано с GIL в python, так как time.sleep выпускает GIL. Однако даже после прочтения об этом я не мог решить вопрос
Просьба показать, как вы читаете данные из сокета в слушателе, что очень важно для вашей проблемы :-) – donkopotamus