电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Python 多進(jìn)程、多線程效率對比

瀏覽:4日期:2022-07-04 18:58:42

Python 界有條不成文的準(zhǔn)則: 計(jì)算密集型任務(wù)適合多進(jìn)程,IO 密集型任務(wù)適合多線程。本篇來作個比較。

通常來說多線程相對于多進(jìn)程有優(yōu)勢,因?yàn)閯?chuàng)建一個進(jìn)程開銷比較大,然而因?yàn)樵?python 中有 GIL 這把大鎖的存在,導(dǎo)致執(zhí)行計(jì)算密集型任務(wù)時多線程實(shí)際只能是單線程。而且由于線程之間切換的開銷導(dǎo)致多線程往往比實(shí)際的單線程還要慢,所以在 python 中計(jì)算密集型任務(wù)通常使用多進(jìn)程,因?yàn)楦鱾€進(jìn)程有各自獨(dú)立的 GIL,互不干擾。

而在 IO 密集型任務(wù)中,CPU 時常處于等待狀態(tài),操作系統(tǒng)需要頻繁與外界環(huán)境進(jìn)行交互,如讀寫文件,在網(wǎng)絡(luò)間通信等。在這期間 GIL 會被釋放,因而就可以使用真正的多線程。

以上是理論,下面做一個簡單的模擬測試: 大量計(jì)算用 math.sin() + math.cos() 來代替,IO 密集型用 time.sleep() 來模擬。 在 Python 中有多種方式可以實(shí)現(xiàn)多進(jìn)程和多線程,這里一并納入看看是否有效率差異:

多進(jìn)程: joblib.multiprocessing, multiprocessing.Pool, multiprocessing.apply_async, concurrent.futures.ProcessPoolExecutor 多線程: joblib.threading, threading.Thread, concurrent.futures.ThreadPoolExecutor

from multiprocessing import Poolfrom threading import Threadfrom concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutorimport time, os, mathfrom joblib import Parallel, delayed, parallel_backenddef f_IO(a): # IO 密集型 time.sleep(5)def f_compute(a): # 計(jì)算密集型 for _ in range(int(1e7)): math.sin(40) + math.cos(40) returndef normal(sub_f): for i in range(6): sub_f(i) returndef joblib_process(sub_f): with parallel_backend('multiprocessing', n_jobs=6): res = Parallel()(delayed(sub_f)(j) for j in range(6)) returndef joblib_thread(sub_f): with parallel_backend(’threading’, n_jobs=6): res = Parallel()(delayed(sub_f)(j) for j in range(6)) returndef mp(sub_f): with Pool(processes=6) as p: res = p.map(sub_f, list(range(6))) returndef asy(sub_f): with Pool(processes=6) as p: result = [] for j in range(6): a = p.apply_async(sub_f, args=(j,)) result.append(a) res = [j.get() for j in result]def thread(sub_f): threads = [] for j in range(6): t = Thread(target=sub_f, args=(j,)) threads.append(t) t.start() for t in threads: t.join()def thread_pool(sub_f): with ThreadPoolExecutor(max_workers=6) as executor: res = [executor.submit(sub_f, j) for j in range(6)]def process_pool(sub_f): with ProcessPoolExecutor(max_workers=6) as executor: res = executor.map(sub_f, list(range(6)))def showtime(f, sub_f, name): start_time = time.time() f(sub_f) print('{} time: {:.4f}s'.format(name, time.time() - start_time))def main(sub_f): showtime(normal, sub_f, 'normal') print() print('------ 多進(jìn)程 ------') showtime(joblib_process, sub_f, 'joblib multiprocess') showtime(mp, sub_f, 'pool') showtime(asy, sub_f, 'async') showtime(process_pool, sub_f, 'process_pool') print() print('----- 多線程 -----') showtime(joblib_thread, sub_f, 'joblib thread') showtime(thread, sub_f, 'thread') showtime(thread_pool, sub_f, 'thread_pool')if __name__ == '__main__': print('----- 計(jì)算密集型 -----') sub_f = f_compute main(sub_f) print() print('----- IO 密集型 -----') sub_f = f_IO main(sub_f)

結(jié)果:

----- 計(jì)算密集型 -----normal time: 15.1212s------ 多進(jìn)程 ------joblib multiprocess time: 8.2421spool time: 8.5439sasync time: 8.3229sprocess_pool time: 8.1722s----- 多線程 -----joblib thread time: 21.5191sthread time: 21.3865sthread_pool time: 22.5104s----- IO 密集型 -----normal time: 30.0305s------ 多進(jìn)程 ------joblib multiprocess time: 5.0345spool time: 5.0188sasync time: 5.0256sprocess_pool time: 5.0263s----- 多線程 -----joblib thread time: 5.0142sthread time: 5.0055sthread_pool time: 5.0064s

上面每一方法都統(tǒng)一創(chuàng)建6個進(jìn)程/線程,結(jié)果是計(jì)算密集型任務(wù)中速度:多進(jìn)程 > 單進(jìn)程/線程 > 多線程, IO 密集型任務(wù)速度: 多線程 > 多進(jìn)程 > 單進(jìn)程/線程。

以上就是Python 多進(jìn)程、多線程效率比較的詳細(xì)內(nèi)容,更多關(guān)于Python 多進(jìn)程、多線程的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 魔方网-培训咨询服务平台 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 临朐空调移机_空调维修「空调回收」临朐二手空调 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 耐火浇注料-喷涂料-浇注料生产厂家_郑州市元领耐火材料有限公司 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 市政路灯_厂家-淄博信达电力科技有限公司 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 微动开关厂家-东莞市德沃电子科技有限公司 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 合肥制氮机_合肥空压机厂家_安徽真空泵-凯圣精机 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 | 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 |