python異步執行帶參數異步執行方法

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章