【发布时间】:2016-06-08 03:21:53
【问题描述】:
这是我在程序中创建的线程的基本概念:
Main thread
|
ListenerCreator(The WebSocketServer thread) ---> Several listener threads(using log())
所以主线程创建了一个ListenerCreator线程,它连接到多个客户端,并为每个客户端创建一个监听线程。以下是侦听器线程所做的简要说明: 编辑1: 我正在使用 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,我会在 log 函数中得到 UnicodeDecodeError。 另外我只收到错误 sometimes ,有时程序运行良好。 (顺便说一下,客户端每次都发送相同的数据) 所以,我的问题是,为什么需要 time.sleep ? 我认为这与 python 中的 GIL 有关,因为 time.sleep 发布了 GIL。但是,即使在阅读后我也无法解决问题
【问题讨论】:
-
请展示您如何从侦听器中的套接字读取数据,这与您的问题非常相关:-)
标签: python multithreading sockets websocket