我想在另一個 Python(主)中實作 Python Tornado Websocket 服務器,并在需要時觸發發送訊息。主要創建兩個執行緒。其中一個用于 Python Server,另一個用于我的將觸發訊息的回圈。
當我從初始啟動服務器時,服務器作業正常,因為它無休止的后續主檔案沒有運行。所以我在一個執行緒內啟動服務器,但這次我收到“RuntimeError:執行緒'Thread-1(start_server)'中沒有當前事件回圈”
主檔案
import tornadoserver
import time
from threading import Lock, Thread
class Signal:
def __init__(self):
#self.socket = tornadoserver.initiate_server()
print("start")
def start_server(self):
print("start Server")
self.socket = tornadoserver.initiate_server()
def brd(self):
print("start Broad")
i = 0
while True:
time.sleep(3)
self.socket.send(i)
i = i 1
def job(self):
# --------Main--------
threads = []
for func in [self.start_server, self.brd, ]:
threads.append(Thread(target=func))
threads[-1].start()
for thread in threads:
thread.join()
Signal().job()
龍卷風服務器.py
import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.websocket as ws
from tornado.options import define, options
import time
define('port', default=4041, help='port to listen on')
ws_clients = []
class web_socket_handler(ws.WebSocketHandler):
@classmethod
def route_urls(cls):
return [(r'/', cls, {}), ]
def simple_init(self):
self.last = time.time()
self.stop = False
def open(self):
self.simple_init()
if self not in ws_clients:
ws_clients.append(self)
print("New client connected")
self.write_message("You are connected")
def on_message(self, message):
if self in ws_clients:
print("received message {}".format(message))
self.write_message("You said {}".format(message))
self.last = time.time()
def on_close(self):
if self in ws_clients:
ws_clients.remove(self)
print("connection is closed")
self.loop.stop()
def check_origin(self, origin):
return True
def send_message(self, message):
self.write_message("You said {}".format(message))
def send(message):
for c in ws_clients:
c.write_message(message)
def initiate_server():
# create a tornado application and provide the urls
app = tornado.web.Application(web_socket_handler.route_urls())
# setup the server
server = tornado.httpserver.HTTPServer(app)
server.listen(options.port)
# start io/event loop
tornado.ioloop.IOLoop.instance().start()
uj5u.com熱心網友回復:
使用谷歌我發現龍卷風問題
在單獨的執行緒中啟動服務器會導致... RuntimeError: 執行緒 'Thread-4' 中沒有當前事件回圈 · 問題 #2308 · tornadoweb/tornado
它表明它必須使用
asyncio.set_event_loop(asyncio.new_event_loop())
在新執行緒中運行事件回圈
像這樣的東西
import asyncio
# ...
def initiate_server():
asyncio.set_event_loop(asyncio.new_event_loop()) # <---
# create a tornado application and provide the urls
app = tornado.web.Application(web_socket_handler.route_urls())
# setup the server
server = tornado.httpserver.HTTPServer(app)
server.listen(options.port)
# start io/event loop
tornado.ioloop.IOLoop.instance().start()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/403036.html
標籤:
