python-asyncio - 如何调用阻塞的异步代码并到达下一行?
问题描述
如何调用f
并到达下一行?
from SomeLib import f
f()
print('never reaches')
我不想弄乱“SomeLib”的内部结构,但如果这是一个快速修复,我会这样做:
def f():
asyncio.get_event_loop.run_until_complete(ag())
async def ag():
async with websockets.client.connect(...) as websocket:
:
await wait_for_recv(...)
async def wait_for_recv(...):
while True:
message = await asyncio.wait_for(websocket.recv(), timeout=time_out)
process(message)
直接调用ag
是一种选择,但怎么做呢?
我试过使用线程。我试过执行者。我试过了new_event_loop
。
我没主意了。
解决方案
我想出了一个解决办法。我怀疑这很糟糕,所以我希望得到反馈。
在呼叫现场:
worker_thread = threading.Thread(target=worker)
worker_thread.start()
def worker:
f()
并摆弄图书馆:
def f():
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
self.loop.call_soon_threadsafe(ag)
# added this
def kill(self):
self.loop.stop()