簡體   English   中英

如何在另一個 Python 中調用 Python Tornado Websocket 服務器

[英]How to call Python Tornado Websocket Server inside another Python

我想在另一個 Python(主)中實現 Python Tornado Websocket 服務器,並在需要時觸發發送消息。 main 創建了兩個線程。 其中一個用於 Python 服務器,另一個用於我的將觸發消息的循環。

當我從初始狀態啟動服務器時,服務器工作正常,但是因為它無窮無盡的主要文件沒有運行。 所以我在一個線程內啟動服務器,但這次我收到“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()

使用谷歌我發現龍卷風問題

在單獨的線程中啟動服務器給出... RuntimeError: There is no current event loop in thread 'Thread-4' · Issue #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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM