Python 3.5 Asyncio 和多个 websocket 服务器
Python 3.5 Asyncio and Multiple websocket servers
我在 Ubuntu 上使用 Python websockets 4.0.1。我想要 2 个 websocket 服务器 运行ning。通过为每个线程创建 2 个线程和独立的事件循环,我能够达到 "kind of work"。 "kind of work",我的意思是两个 websockets 都工作并且响应大约 30 秒,然后其中一个停止。我必须重新启动该过程才能让它们再次工作。如果我只 运行 这两个线程中的一个或另一个,则单个 websocket 永远有效。
我做错了什么,我怎样才能让 2 个 websocket 永远与 asyncio 一起工作?谢谢
# Start VL WebSocket Task
class vlWebSocketTask (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
# Main while loops
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
while True:
try:
print("Starting VL WebSocket Server...")
startVLServer = websockets.serve(vlWebsocketServer, '192.168.1.3', 8777)
asyncio.get_event_loop().run_until_complete(startVLServer)
asyncio.get_event_loop().run_forever()
except Exception as ex:
print(ex)
time.sleep(5)
# Start IR WebSocket Task
class irWebSocketTask (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
while True:
try:
print("Starting IR WebSocket Server...")
startIRServer = websockets.serve(irWebsocketServer, '192.168.1.3', 8555)
asyncio.get_event_loop().run_until_complete(startIRServer)
asyncio.get_event_loop().run_forever()
except Exception as ex:
print(ex)
time.sleep(5)
# Initialize VL WebSocket Task
#VLWebSocketTask = vlWebSocketTask()
#VLWebSocketTask.start()
# Initialize IR WebSocket Task
IRWebSocketTask = irWebSocketTask()
IRWebSocketTask.start()
您不需要线程来 运行 多个异步任务 - 允许多个代理共享同一个事件循环是异步的强项。您应该可以用这样的代码替换 thread-based 类:
loop = asyncio.new_event_loop()
loop.run_until_complete(websockets.serve(vlWebsocketServer, '192.168.1.3', 8777))
loop.run_until_complete(websockets.serve(irWebsocketServer, '192.168.1.3', 8555))
loop.run_forever()
虽然混合线程和 asyncio 并不完全是错误,但正确地这样做需要注意不要混淆单独的 asyncio 实例。将线程用于 asyncio 的安全方法是使用 loop.run_in_executor()
,它 运行 在单独的线程中同步代码而不阻塞事件循环,同时从循环中返回一个对象 await
able。
注意:以上代码是在 asyncio.run()
出现之前编写的,并手动旋转事件循环。在 Python 3.7 及更高版本中,人们可能会这样写:
async def main():
server1 = await websockets.serve(vlWebsocketServer, '192.168.1.3', 8777)
server2 = await websockets.serve(irWebsocketServer, '192.168.1.3', 8555)
await asyncio.gather(server1.wait_closed(), server2.wait_closed())
asyncio.run(main())
我在 Ubuntu 上使用 Python websockets 4.0.1。我想要 2 个 websocket 服务器 运行ning。通过为每个线程创建 2 个线程和独立的事件循环,我能够达到 "kind of work"。 "kind of work",我的意思是两个 websockets 都工作并且响应大约 30 秒,然后其中一个停止。我必须重新启动该过程才能让它们再次工作。如果我只 运行 这两个线程中的一个或另一个,则单个 websocket 永远有效。
我做错了什么,我怎样才能让 2 个 websocket 永远与 asyncio 一起工作?谢谢
# Start VL WebSocket Task
class vlWebSocketTask (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
# Main while loops
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
while True:
try:
print("Starting VL WebSocket Server...")
startVLServer = websockets.serve(vlWebsocketServer, '192.168.1.3', 8777)
asyncio.get_event_loop().run_until_complete(startVLServer)
asyncio.get_event_loop().run_forever()
except Exception as ex:
print(ex)
time.sleep(5)
# Start IR WebSocket Task
class irWebSocketTask (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
while True:
try:
print("Starting IR WebSocket Server...")
startIRServer = websockets.serve(irWebsocketServer, '192.168.1.3', 8555)
asyncio.get_event_loop().run_until_complete(startIRServer)
asyncio.get_event_loop().run_forever()
except Exception as ex:
print(ex)
time.sleep(5)
# Initialize VL WebSocket Task
#VLWebSocketTask = vlWebSocketTask()
#VLWebSocketTask.start()
# Initialize IR WebSocket Task
IRWebSocketTask = irWebSocketTask()
IRWebSocketTask.start()
您不需要线程来 运行 多个异步任务 - 允许多个代理共享同一个事件循环是异步的强项。您应该可以用这样的代码替换 thread-based 类:
loop = asyncio.new_event_loop()
loop.run_until_complete(websockets.serve(vlWebsocketServer, '192.168.1.3', 8777))
loop.run_until_complete(websockets.serve(irWebsocketServer, '192.168.1.3', 8555))
loop.run_forever()
虽然混合线程和 asyncio 并不完全是错误,但正确地这样做需要注意不要混淆单独的 asyncio 实例。将线程用于 asyncio 的安全方法是使用 loop.run_in_executor()
,它 运行 在单独的线程中同步代码而不阻塞事件循环,同时从循环中返回一个对象 await
able。
注意:以上代码是在 asyncio.run()
出现之前编写的,并手动旋转事件循环。在 Python 3.7 及更高版本中,人们可能会这样写:
async def main():
server1 = await websockets.serve(vlWebsocketServer, '192.168.1.3', 8777)
server2 = await websockets.serve(irWebsocketServer, '192.168.1.3', 8555)
await asyncio.gather(server1.wait_closed(), server2.wait_closed())
asyncio.run(main())