首页 > 解决方案 > 如何调用阻塞的异步代码并到达下一行?

问题描述

如何调用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

我没主意了。

标签: python-asyncioblocking

解决方案


我想出了一个解决办法。我怀疑这很糟糕,所以我希望得到反馈。

在呼叫现场:

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

推荐阅读