Python高阶专题:如何平衡多线程以及多进程的选择?

多线程与多线程在具体项目开发中如何平衡?什么场景下使用多线程?什么场景下使用多进程?要了解这些问题之前,首先要对Python中的GIL(全局解释器锁)有比较深刻的了解,GIL限制Python语言发挥多核的优势,使得某一时间点只有一个线程运行在CPU上。总的来说,开发过程中的开发场景逃不开数据密集型场景以及I/O密集型场景,不同的业务场景需求也有差异,顾名思义,数据密集型的场景对于CPU的使用频率要远高于I/O密集型,所以可以得出结论,对于数据密集型的场景来说优先选择多进程可以有效的发挥多核CPU的优势,而I/O密集型的场景可以选择利用多线程很大程度减少系统的开销。在这里插入图片描述

[1] 不同场景下多线程与多进程效率对比
[1.1] 数据密集型

[ 多线程场景 ]

from concurrent.futures import ThreadPoolExecutor,as_completed
import time
def CalFiboleicheNums(num) :
    return 1 if num <= 2 else CalFiboleicheNums(num - 1) + CalFiboleicheNums(num - 2)
if __name__ == "__main__" :
    with ThreadPoolExecutor(3) as executor :
        start = time.time()
        for future in as_completed([executor.submit(CalFiboleicheNums,(nums)) for nums in range(25,35)]) :
            result = future.result()
            print("result : {}".format(result))
        ender = time.time()
        print("all times : {}".format(ender - start))

[ 运行结果 ] all times : 5.2798850536346436

[ 多进程场景 ]

from concurrent.futures import ProcessPoolExecutor,as_completed
import time
def CalFiboleicheNums(num) :
    return 1 if num <= 2 else CalFiboleicheNums(num - 1) + CalFiboleicheNums(num - 2)
if __name__ == "__main__" :
    with ProcessPoolExecutor(3) as executor :
        start = time.time()
        for future in as_completed([executor.submit(CalFiboleicheNums,(nums)) for nums in range(25,35)]) :
            result = future.result()
            print("result : {}".format(result))
        ender = time.time()
        print("all times : {}".format(ender - start))

[ 运行结果 ]all times : 3.032888889312744

[1.2] I/O 密集型

[ 多线程场景 ]

from concurrent.futures import ThreadPoolExecutor,as_completed
import requests
def RequestNewUrl(url) :
    response = requests.get(url = url)
    return  response
if __name__ == "__main__" :
    with ThreadPoolExecutor(3) as executor :
        start = time.time()
        for future in as_completed([executor.submit(RequestNewUrl,(url)) for url in ["https://www.baidu.com"] * 10 ]) :
            result = future.result()
            print("result : {}".format(result))
        ender = time.time()
        print("all times : {}".format(ender - start))

[ 运行结果 ]all times : 0.7370328903198242

[ 多进程场景 ]

from concurrent.futures import ProcessPoolExecutor,as_completed
import requests
def RequestNewUrl(url) :
    response = requests.get(url = url)
    return  response
if __name__ == "__main__" :
    with ProcessPoolExecutor(3) as executor :
        start = time.time()
        for future in as_completed([executor.submit(RequestNewUrl,(url)) for url in ["https://www.baidu.com"] * 10 ]) :
            result = future.result()
            print("result : {}".format(result))
        ender = time.time()
        print("all times : {}".format(ender - start))

[ 运行结果 ]all times :1.0711357593536377

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值