【问题标题】:Run WebSocket server in Thread在线程中运行 WebSocket 服务器
【发布时间】:2016-07-11 08:43:03
【问题描述】:

这可能更多是关于线程的问题,而不是关于我的 websocket 的问题。 我正在使用来自 github (https://github.com/dpallot/simple-websocket-server) 的“SimpleWebSocket” 该示例运行良好:

from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket

class SimpleEcho(WebSocket):

    def handleMessage(self):
        # echo message back to client
        self.sendMessage(self.data)

    def handleConnected(self):
        print self.address, 'connected'

    def handleClose(self):
        print self.address, 'closed'

server = SimpleWebSocketServer('', 8000, SimpleEcho)
server.serveforever()

服务器正在运行,我可以连接并发送消息。

现在我尝试使用这些类将其作为线程运行: 这个应该创建许多线程,包括 WebSocketServer

from websockethread import WebSocketThread
class startManyThreads:
    def __init__(self):
        self.thread1 = WebSocketThread()
        self.thread1.start()

if __name__ == "__main__":
    startManyThreads = startManyThreads()

这个类应该作为我的线程运行:

import threading
from SimpleWebSocketServer import SimpleWebSocketServer
from webSocketServer import WebSocketServer

class WebSocketThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        server = SimpleWebSocketServer('', 8000, WebSocketServer)
        server.serveforever()

这是“定制的”回声示例:

from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket

class SimpleEcho(WebSocket):

    def handleMessage(self):
        # echo message back to client
        self.sendMessage(self.data)

    def handleConnected(self):
        print self.address, 'connected'

    def handleClose(self):
        print self.address, 'closed'

我也试过推导出这个:class SimpleEcho(WebSocket, threading.Thread):

任何想法我做错了什么? & 提前非常感谢!

编辑: 当我运行“simpleEcho”时的结果是我得到一个提示可以通过websocket.html(在github上提供)连接,发送和接收消息

当我将它放入一个线程(我尝试过的 3 种方法中的任何一种)时的结果是相同的行为,除非我尝试从 websocket.html“连接”我得到一个“错误:未定义”。通过 nmap 我检查了服务器似乎正在运行并监听端口 8000

编辑 2:从 SimpleWebSocketServer 派生新类

import threading

from SimpleWebSocketServer import SimpleWebSocketServer

class ThreadSimpleWebSocketThread(threading.Thread, SimpleWebSocketServer):
    def __init__(self, serversocket):
        threading.Thread.__init__(self)
        self.serversocket = serversocket

    def serveforever(self):
        SimpleWebSocketServer.serversocket = self.serversocket
        SimpleWebSocketServer.selectInterval = 0.1
        SimpleWebSocketServer.listeners = [self.serversocket]
        super(ThreadSimpleWebSocketThread, self).serveforever()

    def run(self):
        self.serveforever()

【问题讨论】:

  • 预期行为和实际行为是什么?
  • 预期的行为是我可以连接到 github 上提供的“测试客户端”。实际行为是,一旦我将它作为线程运行,我就会得到一个“未定义的错误”(在测试“主页”上)。其他地方没有错误

标签: python multithreading websocket


【解决方案1】:

主要问题似乎是在哪里您正在启动服务器。 Thread.__init__() 方法在(调用者的)主线程中运行,而不是实际的WebSocketThread()。这需要在Thread.run() 方法中完成:

class WebSocketThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        server = SimpleWebSocketServer('', 8000, WebSocketServer)
        server.serveforever()

run() 内部的代码实际上是在线程内部运行的。

请注意,由于全局解释器锁,线程不会大大提高性能,您可能需要multiprocessing。但是,如果您只是想减轻 I/O 等待的负担,这应该可以正常工作。

编辑:通过查看这个 GitHub 项目,并重新考虑您要做什么,这并非易事。您必须在SimpleEcho() 类中覆盖WebSocket.serveforever(),并将其更改为接受套接字并将接受的套接字传递给Thread(参见here)。

【讨论】:

  • 我使用线程是因为有一堆其他的东西同时完成。我也已经尝试过这种方法。从 Python 方面来看,它看起来像它的工作(只是控制台中的一个空白提示 - 就像独立版本一样)但我总是在错误“未定义”中得到错误
  • 在我的回答中进行修复后,您可以编辑并在底部显示完整的代码吗?
  • 这正是上面的代码(来自我的初始帖子),“WebSocketThread”类是你帖子中的这个(复制和粘贴)。它似乎正在运行,但我无法连接。 nmap 还显示端口 8000 已打开并正在侦听
  • 我正在尝试覆盖 SimpleEcho 中的 serverforever()。我现在遇到的问题是 serveforever() 是 SimpleWebSocketServer 的一种方法,并且它是从对象派生的。 SimpleWebSocketServer 和 WebSocket 之间的唯一连接是 SimpleWebSocketServer 构造函数中的参数。我是否必须更改 serveforver() 方法才能接收套接字?
  • 抱歉,我应该说的是扩展SimpleWebSocketServer() 以创建ThreadedSimpleWebSocketServer()(并使用它),然后覆盖serveforever() 使其将套接字传递给新线程。跨度>
猜你喜欢
  • 2021-06-06
  • 2018-12-23
  • 2014-09-23
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多