目前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())