新开一个线程启动 websocket 服务端

2020-06-09 23:41:55 +08:00
 mart1nN

师父们,是这样:小弟写了一个接口,每次执行这个方法需要在一个新的线程中启动一个简单的 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 一下就可以,然而。。。自闭了。

师父们救命

2281 次点击
所在节点    Python
5 条回复
MoYi123
2020-06-09 23:45:23 +08:00
这个 loop 要从主线程传进来。
SingeeKing
2020-06-10 00:10:39 +08:00
把 loop = asyncio.new_event_loop()、asyncio.set_event_loop(loop) 两行放在 websockets.serve 前面
jdhao
2020-06-10 00:21:40 +08:00
2 楼正解。你遇到的问题正好最近我也遇到了 https://jdhao.github.io/2020/06/07/asyncio_inside_flask/
mart1nN
2020-06-10 13:04:35 +08:00
@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()又不能执行到接下来的一步进行关闭,所以报错了嵌套字地址只允许使用一次。请问这该咋整
Latin
2020-06-10 14:06:24 +08:00
https://github.com/heroku-python/flask-sockets
别自己写了,用用这个吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680183

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX