python多進程和多線程效率比較,ProcessPoolExecutor,ThreadPoolExecutor


一下代碼使用官方進程池和線程池測試,運行10萬次函數時間。

 

import time
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# import nb_log

def f(x):
    pass
    if x%1000 == 0:
        print(x)


if __name__ == '__main__':
    pool = ProcessPoolExecutor(10)  # 這個分別測試進程池和線程池運行10萬次無io 無cpu函數的耗時
    # pool = ThreadPoolExecutor(10)
    t1 = time.time()
    for i in range(100000):
        pool.submit(f, i)
    pool.shutdown()
    print(time.time() - t1)

 

 

win上進程池消耗240秒,linux虛擬機進程池消費26秒。

win線程池消耗4秒,linux虛擬機線程池1.3秒。

總之就是進程池性能不是很好。linux跑代碼比win上更適合,通常情況下,性能更好,特別是涉及到信號量 並發 文件鎖什么的,linux性能明顯好於win。

 

多進程光是主進程submit任務都要消耗大量cpu。每秒執行任意函數不可能突破1000次。

進程池不適合快速頻繁sumit,不適合頻繁操作進程queue,適合直接啟動多個進程,每個進程自己從redis拉取任務,這樣的10進程性能暴擊ProcessPoolExecutor的submit。

 

 

下面的方式是自動每進程拉取redis消費。沒有涉及到父子進程通過進程queue通信解耦消費。

import time
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import nb_log
from function_scheduling_distributed_framework import task_deco, BrokerEnum,ConcurrentModeEnum


@task_deco('test_multi', broker_kind=BrokerEnum.REDIS, log_level=20,concurrent_mode=ConcurrentModeEnum.SINGLE_THREAD)
def f(x):
    pass
    if x % 1000 == 0:
        print(x)


if __name__ == '__main__':
    for i in range(100000):
        f.push(i)
    f.multi_process_consume(10)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM