如何在类和现有事件循环中将Python的websocket与asyncio一起使用

LZR_13

我目前正在尝试将websocket界面集成到我的程序中。为此,我正在使用https://websockets.readthedocs.io/en/stable/intro.html模块以及asyncio。我目前正在努力在专用类中实现websocket功能,该类将websocket任务设置为在与MyDriver类中运行的任务相同的事件循环中并发运行。

main.py

from myDriver import MyDriver
from webSocketServer import WebSocketServer

async def main():

   # loop = asyncio.get_event_loop()
   driver = MyDriver()
   ws = WebSocketServer()
   await driver.drive()
   # The following does not integrate properly with the above. The msgHandler is not ran 
   await websockets.serve(lambda websocket, path: ws.msgHandler(websocket, path), "localhost", 5678)

asyncio.run(main())

这里的lambda摆脱了来自类的自我争论。

webSocketServer.py

import asyncio
import websockets

class WebSocketServer:

    def __init__(self):
        print('Init')

    async def msgHandler(self, websocket, path):
        self.sendTask = asyncio.create_task(self.sendHandler(websocket, path))
        self.receiveTask = asyncio.create_task(self.receiveHandler(websocket, path))

        await asyncio.wait([self.sendTask, self.receiveTask], return_when=asyncio.FIRST_COMPLETED)

    async def sendHandler(self, websocket, path):
        while True:
            await asyncio.sleep(2)
            message = producer()
            await websocket.send(message)

    async def receiveHandler(self, websocket, path):
        async for message in websocket:
            await self.printMsg()

    async def printMsg(self, msg):
        await asyncio.sleep(0.1)
        print(msg)

    def producer():
        return 'Hi !'

我的实现基于websockets入门页面上提供的示例。他们使用loop.run_until_complete(server)loop.run_forever()API。我还尝试通过将loopin参数传递给的构造函数来使用它们WebSocketServer(loop)并在websockets.serve(lambda websocket, path: ws.msgHandler(websocket, path), "localhost", 5678)那里进行操作,但随后出现错误RuntimeError: This event loop is already running我还查看了loop.create_task(),其中将协程作为参数。

有没有人看到我可以正确集成与我的其他任务在同一事件循环中运行的websocket服务器的方法?谢谢 !

用户名

他们使用loop.run_until_complete(server)loop.run_forever()API。

最好将它们转换为asyncio.run(),这是启动异步代码的更健壮的方法。只是您的转换不完整,缺少了run_forever()一部分。run_forever()之所以需要这样的东西,是因为websockets.serve()它并不意味着“完成后提供服务并退出”,而是意味着“开始提供服务并向服务器返回一个句柄”。该句柄将立即(几乎)返回,并且如果您从那时返回main,如您的代码那样,程序将在处理单个连接之前退出。

您需要做的是在main的末尾添加另一个等待,只要程序需要运行,您就可以在其中等待。一种方法是to await asyncio.Event().wait(),它将永远等待,并且与await等效loop.run_forever()而且由于可以使用服务器对象,因此wait_closed()只要服务器正在运行(即协程有意通过调用来将server.close()关闭),就可以使用其方法来等待,这可能就是您想要的。

换句话说,您需要将的最后一行修改main()为:

   server = await websockets.serve(lambda websocket, path: ws.msgHandler(websocket, path), "localhost", 5678)
   await server.wait_closed()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在jQuery .each()循环中将.slice()与返回的文本一起使用?

来自分类Dev

如何在for循环中将ggplot2 aes_string()与cut()一起使用?

来自分类Dev

如何在while和foreach循环中一起使用PHP和MySQL?

来自分类Dev

如何在for循环中一起使用innerHTML和ejs?

来自分类Dev

如何在带有R的for循环中将“ paste”命令与“ ifelse”命令结合在一起?

来自分类Dev

Jupyter Notebook RuntimeError:无法在现有事件循环中使用HTMLSession

来自分类Dev

如何在带有Java类的Elasticsearch中将geo_point与geohash一起使用?

来自分类Dev

如何在Python中将if语句与数组一起使用?

来自分类Dev

如何在OSX中将OpenCV与python一起使用?

来自分类Dev

如何在python中将GridSearchCV与管道和超参数一起使用

来自分类Dev

如何在XAML中将按钮上的交互触发器与MouseUp和MouseDown事件一起使用?

来自分类Dev

一起触发所有事件

来自分类Dev

为什么出现错误“无法在现有事件循环中使用HTMLSession。请改用AsyncHTMLSession”?

来自分类Dev

如何在gtest中将朋友类与命名空间一起使用

来自分类Dev

如何在Swift中将NSCoding与单例类一起使用

来自分类Dev

如何在vb.net中将'withevents'与数组类一起使用?

来自分类Dev

如何在gtest中将朋友类与命名空间一起使用

来自分类Dev

如何在笔记本电脑中将Ubuntu 14.04与相同的现有OS一起安装?

来自分类Dev

在 python 中将类与 Tkinter 一起使用

来自分类Dev

在for循环中将值加在一起(Python)

来自分类Dev

如何在Python中将边缘检测结果和原始图片拼凑在一起

来自分类Dev

如何在API和Worker中将芹菜与不同的代码库一起使用

来自分类Dev

如何在PHP中将array_combine和str_replace一起使用

来自分类Dev

如何在RESTful中将VisualCaptcha与AngularJS和slimPHP一起使用

来自分类Dev

如何在VB 2012中将Tag属性与表单和代码一起使用?

来自分类Dev

如何在VB.NET中将SUM和GROUP BY(SQL)与Visual FoxPro一起使用?

来自分类Dev

如何在(linq和lambda)中将select与max,min函数一起使用?

来自分类Dev

如何在vimrc文件中将'autocmd'和'augroup'与'map {lhs} {rhs}'一起使用?

来自分类Dev

如何在Java中将List <object>与Integer和Float一起使用?

Related 相关文章

  1. 1

    如何在jQuery .each()循环中将.slice()与返回的文本一起使用?

  2. 2

    如何在for循环中将ggplot2 aes_string()与cut()一起使用?

  3. 3

    如何在while和foreach循环中一起使用PHP和MySQL?

  4. 4

    如何在for循环中一起使用innerHTML和ejs?

  5. 5

    如何在带有R的for循环中将“ paste”命令与“ ifelse”命令结合在一起?

  6. 6

    Jupyter Notebook RuntimeError:无法在现有事件循环中使用HTMLSession

  7. 7

    如何在带有Java类的Elasticsearch中将geo_point与geohash一起使用?

  8. 8

    如何在Python中将if语句与数组一起使用?

  9. 9

    如何在OSX中将OpenCV与python一起使用?

  10. 10

    如何在python中将GridSearchCV与管道和超参数一起使用

  11. 11

    如何在XAML中将按钮上的交互触发器与MouseUp和MouseDown事件一起使用?

  12. 12

    一起触发所有事件

  13. 13

    为什么出现错误“无法在现有事件循环中使用HTMLSession。请改用AsyncHTMLSession”?

  14. 14

    如何在gtest中将朋友类与命名空间一起使用

  15. 15

    如何在Swift中将NSCoding与单例类一起使用

  16. 16

    如何在vb.net中将'withevents'与数组类一起使用?

  17. 17

    如何在gtest中将朋友类与命名空间一起使用

  18. 18

    如何在笔记本电脑中将Ubuntu 14.04与相同的现有OS一起安装?

  19. 19

    在 python 中将类与 Tkinter 一起使用

  20. 20

    在for循环中将值加在一起(Python)

  21. 21

    如何在Python中将边缘检测结果和原始图片拼凑在一起

  22. 22

    如何在API和Worker中将芹菜与不同的代码库一起使用

  23. 23

    如何在PHP中将array_combine和str_replace一起使用

  24. 24

    如何在RESTful中将VisualCaptcha与AngularJS和slimPHP一起使用

  25. 25

    如何在VB 2012中将Tag属性与表单和代码一起使用?

  26. 26

    如何在VB.NET中将SUM和GROUP BY(SQL)与Visual FoxPro一起使用?

  27. 27

    如何在(linq和lambda)中将select与max,min函数一起使用?

  28. 28

    如何在vimrc文件中将'autocmd'和'augroup'与'map {lhs} {rhs}'一起使用?

  29. 29

    如何在Java中将List <object>与Integer和Float一起使用?

热门标签

归档