在包含阻塞代码的函数中运行异步代码


import asyncio
import time

def blocking_function():
print("Blocking function called")
time.sleep(5)
print("Blocking function finished")

async def concurrent_function():
for x in range(10):
print(x)
await asyncio.sleep(1)

async def main():
print("Main function called")
loop = asyncio.get_event_loop()
loop.run_in_executor(None, blocking_function)
await concurrent_function()
print("Main function finished")
if __name__ == "__main__":
asyncio.run(main())

当试图在asyncio代码同时运行时运行阻塞函数时,这可以完美地工作。然而,如果我有一个函数,其中包含阻塞代码(如。一个不是异步的库,我无法做到这一点)因为该函数既包含阻塞代码,也包含异步代码,所以我不能使用run in executor。我怎么才能避开这个问题呢?

下面的代码由于没有等待blocking_function而不幸出错,但是您不能将其与run_in_executor结合使用

async def blocking_function():
for x in range(4):
print("Blocking function called")
time.sleep(1)
print("Blocking function finished")
print("Async code running:")
await asyncio.sleep(1)
print("Async code finished")

async def concurrent_function():
for x in range(10):
print(x)
await asyncio.sleep(1)
async def main():
print("Main function called")
loop = asyncio.get_event_loop()
loop.run_in_executor(None, blocking_function)
await concurrent_function()
print("Main function finished")
if __name__ == "__main__":
asyncio.run(main())

在第二个线程中创建一个事件循环,并在那里运行async函数。

import asyncio
import time
async def blocking_function():
for x in range(4):
print("Blocking function called")
time.sleep(1)
print("Blocking function finished")
print("Async code running:")
await asyncio.sleep(1)
print("Async code finished")
def async_blocking_function_runner(func):
# creates another event loop in the other thread and runs func in it
res = asyncio.run(func())
return res

async def concurrent_function():
for x in range(10):
print(x)
await asyncio.sleep(1)

async def main():
print("Main function called")
loop = asyncio.get_event_loop()
res = loop.run_in_executor(None, async_blocking_function_runner, blocking_function)
await concurrent_function()
await res  # make sure the task in second thread is done
print("Main function finished")
if __name__ == "__main__":
asyncio.run(main())

最新更新