У меня есть GUI-программа на основе tkinter, работающая в Python 3.4.1. У меня есть несколько потоков, запущенных в программе, чтобы получать данные JSON из разных URL-адресов. Я хочу добавить некоторые функции WebSocket, чтобы позволить программе действовать как сервер и разрешать нескольким клиентам подключаться к ней через WebSocket и обмениваться другими данными JSON.
Я пытаюсь использовать сервер Autobahn | Python WebSocket для asyncio.
Сначала я попытался запустить цикл событий asyncio в отдельном потоке в программе GUI. Тем не менее, каждая попытка дает "AssertionError: в потоке" Thread-1 "отсутствует текущий цикл событий.
Затем я попробовал развернуть процесс со стандартным пакетом многопроцессорной библиотеки, который запускал цикл событий asyncio в другом Процессе. Когда я пытаюсь это сделать, я не получаю никаких исключений, но сервер WebSocket также не запускается.
Возможно ли даже запустить цикл событий asyncio в подпроцессе из другой программы Python?
Есть ли способ интегрировать цикл событий asyncio в текущую многопоточную/tkinter-программу?
UPDATE Ниже приведен фактический код, который я пытаюсь запустить для первоначального теста.
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 для asyncio. Если я попытаюсь запустить его как процесс, он ничего не сделает, ни один клиент не сможет подключиться к нему, если я запустил netstat -a, не используется порт 6900. Если просто использовать start_server() в основной программе, он создает сервер WebSocket.