我有一个类似于在python中写聊天室的应用程序,它打算做以下事情:
我的方法是使用主线程来处理用户输入。当用户点击进入时,使用AutoBahn的扭曲模块为WebSocketClient创建一个线程,并将一个队列传递给它。检查反应堆是否正在运行,如果不是,则启动它。 覆盖消息方法,以便在获得“关闭”时将关闭标志放入队列中。主线程将忙于检查队列,直到收到标志并返回开始。代码如下所示。
主线程。
def main_thread():
while True:
text = raw_input("Input server url or exit")
if text == "exit":
if myreactor:
myreactor.stop()
break
msgq = Queue.Queue()
threading.Thread(target=wsthread, args=(text, msgq)).start()
is_close = False
while True:
if msgq.empty() is False:
msg = msgq.get()
if msg == "close":
is_close = True
else:
print msg
if is_close:
break
print 'Websocket client closed!'
工厂和协议。
class MyProtocol(WebSocketClientProtocol):
def onMessage(self, payload, isBinary):
msg = payload.decode('utf-8')
self.Factory.q.put(msg)
if msg == 'close':
self.dropConnection(abort=True)
class WebSocketClientFactoryWithQ(WebSocketClientFactory):
def __init__(self, *args, **kwargs):
self.queue = kwargs.pop('queue', None)
WebSocketClientFactory.__init__(self, *args, **kwargs)
客户线程。
def wsthread(url, q):
factory = WebSocketClientFactoryWithQ(url=url, queue=q)
factory.protocol = MyProtocol
connectWS(Factory)
if myreactor is None:
myreactor = reactor
reactor.run()
print 'Done'
现在我遇到了问题。似乎我的客户端线程永远不会停止。即使我收到“关闭”,它似乎仍在运行,每次我尝试重新创建一个新客户端时,它都会创建一个新线程。我理解第一个线程不会停止,因为reactor.run()
将永远运行,但是从第二个线程开始,它应该是非阻塞的,因为我不再启动它了。我怎么能改变它?
修改
我最终用
来解决它stopFactory()
。reactor.callFromThread()
制作协议功能。reactor.callInThread()
创建它们。答案 0 :(得分:0)
您的main_thread
创建了运行wsthread
的新主题。 wsthread
使用Twisted API。 第一个 wsthread
成为反应堆线程。所有后续线程都是不同的,如果您使用Twisted API,则未定义会发生什么。
您几乎肯定会从应用程序中删除线程的使用。要在基于Twisted的应用程序中处理控制台输入,请查看twisted.conch.stdio
(不是Twisted中记录最好的部分,唉,只是你想要的)。