在这个示例中,我们使用了 functools.partial
来创建一个带有参数的部分函数 partial_blocking_function2
,然后将这个部分函数传递给 loop.run_in_executor()
方法。接着,我们使用 asyncio.gather()
来等待两个任务的完成。
通过这种方式,你可以调用带有参数的函数,并在 asyncio 中实现在新线程中执行多个耗时操作,同时不阻塞后续代码的执行。
带参数的异步执行方法:
import asyncio
import time
import functools
def blocking_function():
# 模拟耗时操作
time.sleep(2)
print('---------------blocking_function exeute-------------------')
return "Blocking function is done"
def blocking_function2(msg):
# 模拟耗时操作
time.sleep(2)
print('---------------blocking_function2 exeute-------------------'+msg)
return "Blocking function is done"
async def main():
loop = asyncio.get_running_loop()
task = loop.run_in_executor(None, blocking_function)
#带参数的blocking_function2方法
partial_blocking_function2 = functools.partial(blocking_function2, " with message")
task2 = loop.run_in_executor(None, partial_blocking_function2)
# 继续执行后续的代码逻辑
print("This line will be executed immediately after run_in_executor")
time.sleep(50)
#result = await task
#print(result)
asyncio.run(main())
两个参数的:
import asyncio
import time
import functools
def blocking_function():
# 模拟耗时操作
time.sleep(2)
print('---------------blocking_function exeute-------------------')
return "Blocking function is done"
def blocking_function2(msg):
# 模拟耗时操作
time.sleep(2)
print('---------------blocking_function2 exeute-------------------'+msg)
return "Blocking function is done"
def blocking_function3(msg,ss):
# 模拟耗时操作
time.sleep(2)
print(ss+'---------------blocking_function3 exeute-------------------'+msg)
return "Blocking function is done"
async def main():
loop = asyncio.get_running_loop()
task = loop.run_in_executor(None, blocking_function)
#带参数的blocking_function2方法
partial_blocking_function2 = functools.partial(blocking_function2, " with message")
task2 = loop.run_in_executor(None, partial_blocking_function2)
partial_blocking_function3 = functools.partial(blocking_function3, " with message",'33333')
task3 = loop.run_in_executor(None, partial_blocking_function3)
# 继续执行后续的代码逻辑
print("This line will be executed immediately after run_in_executor")
time.sleep(50)
#result = await task
#print(result)
asyncio.run(main())