师父们,是这样:小弟写了一个接口,每次执行这个方法需要在一个新的线程中启动一个简单的 websocket 服务,代码是这样的:
// 接口中新开线程
t1 = threading.Thread(target=create_websocket)
t1.start()
async def serve(websocket, path):
# 推送消息代码省略
def create_websocket():
start_server = websockets.serve(serve, "localhost", 8765)
# asyncio.get_event_loop().run_until_complete(start_server)
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(start_server)
然后一直报错:RuntimeError: There is no current event loop in thread 'Thread-XXX'.
查了很多博客都说 new_event_loop()后 set 一下就可以,然而。。。自闭了。
师父们救命
1
MoYi123 2020-06-09 23:45:23 +08:00
这个 loop 要从主线程传进来。
|
2
SingeeKing 2020-06-10 00:10:39 +08:00
把 loop = asyncio.new_event_loop()、asyncio.set_event_loop(loop) 两行放在 websockets.serve 前面
|
3
jdhao 2020-06-10 00:21:40 +08:00
2 楼正解。你遇到的问题正好最近我也遇到了 https://jdhao.github.io/2020/06/07/asyncio_inside_flask/
|
4
mart1nN OP @SingeeKing @jdhao 解决了,谢谢师父。不过又产生了一个新问题
```python loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) start_server = websockets.serve(serve, "localhost", 8765) loop.run_until_complete(start_server) ``` 由于我的 start_server 只是 serve(serve)函数的调用,所以 serve 方法没有执行就结束了,必须要 loop.run_forever()才能正常使用。但是用了 loop.run_forever()又不能执行到接下来的一步进行关闭,所以报错了嵌套字地址只允许使用一次。请问这该咋整 |
5
Latin 2020-06-10 14:06:24 +08:00
|