V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mart1nN
V2EX  ›  Python

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

  •  
  •   mart1nN · 2020-06-09 23:41:55 +08:00 · 2074 次点击
    这是一个创建于 1408 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    师父们救命

    5 条回复    2020-06-10 14:06:24 +08:00
    MoYi123
        1
    MoYi123  
       2020-06-09 23:45:23 +08:00
    这个 loop 要从主线程传进来。
    SingeeKing
        2
    SingeeKing  
       2020-06-10 00:10:39 +08:00
    把 loop = asyncio.new_event_loop()、asyncio.set_event_loop(loop) 两行放在 websockets.serve 前面
    jdhao
        3
    jdhao  
       2020-06-10 00:21:40 +08:00
    2 楼正解。你遇到的问题正好最近我也遇到了 https://jdhao.github.io/2020/06/07/asyncio_inside_flask/
    mart1nN
        4
    mart1nN  
    OP
       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
        5
    Latin  
       2020-06-10 14:06:24 +08:00
    https://github.com/heroku-python/flask-sockets
    别自己写了,用用这个吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3233 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 393ms · UTC 14:06 · PVG 22:06 · LAX 07:06 · JFK 10:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.