一下代碼使用官方進程池和線程池測試,運行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)