如何在另一个Python中调用Python Tornado Websocket Server



我想在另一个Python(main(中实现Python Tornado Websocket Server,并在需要时触发发送消息。main创建两个线程。其中一个用于PythonServer,另一个用于将触发消息的my循环。

当我从初始启动服务器时,服务器工作得很好,因为它后面的无休止的主文件并没有运行。所以我在线程内启动服务器,但这次我收到";RuntimeError:线程"thread-1(start_server("中没有当前事件循环;

Main.py

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()

使用谷歌我发现龙卷风问题

在单独的线程中启动服务器会给出。。。RuntimeError:线程'thread-4'中没有当前事件循环·Issue#2308·龙卷风/龙卷风

这表明它必须使用

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()

最新更新