在這個示例中,我們使用了 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())