【问题标题】:How do I run an method async inside a class that is being used with asyncio.create_server?如何在与 asyncio.create_server 一起使用的类中运行异步方法?
【发布时间】:2016-09-19 02:29:21
【问题描述】:

我正在使用带有 asyncio 的高速公路,并且我正在尝试在扩展 WebSocketServerFactory 的类中创建一个方法,该方法每 x 秒运行一次。

高速公路网站上的文档是这样做的:

from autobahn.asyncio.websocket import WebSocketServerFactory
factory = WebSocketServerFactory()
factory.protocol = MyServerProtocol

loop = asyncio.get_event_loop()
coro = loop.create_server(factory, '127.0.0.1', 9000)
server = loop.run_until_complete(coro)

我只是简单地将 WebSocketServerFactory 类替换为扩展它的类,并且我想每隔 x 秒在其中运行一个方法。

我在高速公路网站上找到了一个这样的例子,但它使用了 twisted 而不是 asyncio。

这是我想要的一个简短示例(original and full version),但该示例使用了扭曲:

class CustomServerFactory(WebSocketServerFactory):

def __init__(self, url):
    WebSocketServerFactory.__init__(self, url)
    self.tick()

def tick(self):
    print("tick!")
    self.do_something()
    reactor.callLater(1, self.tick)

如何使用 asyncio 实现相同的目标?

【问题讨论】:

    标签: python python-asyncio autobahn


    【解决方案1】:

    根据您的示例,可以使用 asyncio 事件循环来完成与 asyncio 相同的功能:Asyncio delayed calls

    所以在你的例子中,这意味着这样的事情:

    def tick(self):
        print("tick!")
        self.do_something()
        loop.call_later(1, self.tick)
    

    其中 loop 是您之前创建的异步事件循环变量:

    loop = asyncio.get_event_loop()
    

    【讨论】:

    • 将循环传递给类,然后使用 self.loop.call_later 似乎效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2017-05-11
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多