[英]Run WebSocket server in Thread
這可能是關於線程的問題,而不是關於我的websocket。 我正在使用github的“SimpleWebSocket”( https://github.com/dpallot/simple-websocket-server )這個例子很好用:
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()
主要的問題似乎是在那里你啟動服務器。 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()
的代碼實際上在線程內部run()
。
請注意,由於全局解釋器鎖定,線程不會提高性能,您可能需要multiprocessing
。 但是,如果您只想卸載I / O等待,這應該可以正常工作。
編輯 :從查看這個GitHub項目,並重新思考你想要做的事情,這不是微不足道的。 您必須覆蓋SimpleEcho()
類中的WebSocket.serveforever()
並將其更改為接受套接字並將接受的套接字傳遞給Thread
(請參閱此處 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.