Python websockets:如何使用异步调用覆盖同步方法 WebSocketCommonProtocol.con



目前WebSocketCommonProtocol.connection_made()被定义为同步调用。如果我想覆盖它并添加一些异步调用,似乎没有办法做到这一点。

示例:我使用 aioredis 与 Redis 交谈;但在覆盖WebSocketCommonProtocol.connection_made()时我无法使用 aioredis。我能想到的唯一解决方法是在此函数中使用同步库 redis-py,但在其他地方使用 aioredis。它有效,但非常丑陋。

asgiref.sync.async_to_sync()在这里不起作用:我已经运行了事件循环。此提交将阻止我使用它:https://github.com/django/asgiref/commit/9d42cb57129bd8d94a529a5c95dcf9f5d35a9beb

WebSocketCommonProtocol.connection_made()继承自asyncio.StreamReaderProtocol.connection_made()。所以即使对于python标准库来说,这也是一个通用问题。不知道是否有人已经知道解决方案。

请给我一些解决此问题的建议。

制定出一个解决方案:https://pypi.org/project/syncasync/

它将在新线程中运行异步代码。因此,它不会与同步代码产生争用条件。这种方法非常慢:主线程将等待同步代码,同步代码将等待新线程完成。

与其他解决方案相比:在程序中同时使用同步和异步库,此解决方案将允许您仅使用异步库。

试一试,让我知道任何错误,或提出更好的方法。

例:

#!/usr/bin/env python
import asyncio
from syncasync import async_to_sync

class Base:
def method(self):
pass
def run(self):
self.method()

class Derived(Base):
@async_to_sync
async def method(self):
await asyncio.sleep(0)

async def test():
d = Derived()
d.run()

if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(test())

相关内容

  • 没有找到相关文章

最新更新