我有一个基于tkinter的GUI程序,运行在Python 3.4.1上。程序中有几个线程从各种URL获取JSON数据。我想添加WebSocket功能,以使程序能够作为服务器运行,并允许多个客户端通过WebSocket连接并交换其他JSON数据。
我尝试使用Autobahn|Python WebSocket服务器来进行异步操作。
我首先尝试在GUI程序下启动一个独立的线程来运行异步事件循环。然而,每次尝试都会给出“AssertionError: There is no current event loop in thread 'Thread-1'”。
然后,我尝试使用标准库multiprocessing包在另一个进程中运行异步事件循环。虽然没有出现任何异常,但WebSocket服务器也没有启动。
是否可能从另一个Python程序中的子进程中运行异步事件循环?
是否有办法将异步事件循环集成到当前的多线程/tkinter程序中?
更新:下面是我尝试进行初始测试的实际代码。
from autobahn.asyncio.websocket import WebSocketServerProtocol
from autobahn.asyncio.websocket import WebSocketServerFactory
import asyncio
from multiprocessing import Process
class MyServerProtocol(WebSocketServerProtocol):
def onConnect(self, request):
print("Client connecting: {0}".format(request.peer))
def onOpen(self):
print("WebSocket connection open.")
def onMessage(self, payload, isBinary):
if isBinary:
print("Binary message received: {0} bytes".format(len(payload)))
else:
print("Text message received: {0}".format(payload.decode('utf8')))
## echo back message verbatim
self.sendMessage(payload, isBinary)
def onClose(self, wasClean, code, reason):
print("WebSocket connection closed: {0}".format(reason))
def start_server():
factory = WebSocketServerFactory("ws://10.241.142.27:6900", debug = False)
factory.protocol = MyServerProtocol
loop = asyncio.get_event_loop()
coro = loop.create_server(factory, '10.241.142.27', 6900)
server = loop.run_until_complete(coro)
loop.run_forever()
server.close()
loop.close()
websocket_server_process = Process(target = start_server)
websocket_server_process.start()
其中大部分内容来自于Autobahn|Python异步IO示例代码。如果我尝试将其作为进程运行,则不会发生任何事情,没有客户端能够连接它,如果我运行netstat -a,则没有使用端口6900。如果只在主程序中使用start_server(),则可以创建WebSocket服务器。