python进程池和线程池的区别

 更新时间:2023年12月10日 11:43:34   作者:乐神来了  
本文主要介绍了python进程池和线程池的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

线程池和多线程的区别:

线程池可以减少线程创建和销毁的开销,并控制并发数量,从而提高系统的性能。多线程可以并发执行程序中的不同任务,提高程序的效率和系统的吞吐量。
如果需要同时处理多个任务并且这些任务之间没有依赖关系,那么可以选择多线程;如果需要限制同时执行的任务数量或者需要复用线程来避免频繁创建和销毁线程的开销或者当需要执行的任务数量很大但是每个任务所需的时间较短并且执行时间相对稳定,那么可以选择线程池。

进程池和多进程的区别:

如果你需要同时执行多个不同的任务,使用多进程;如果你需要并行处理多个任务,并且每个任务都是独立的,那么多进程会是一个不错的选择。每个进程都有自己的内存空间和独立的 CPU 时间,可以避免多个任务之间的相互干扰。
如果你需要限制并发执行任务的数量,使用进程池。如果你的任务数比较大,而且每个任务执行时间较短,那么进程池可能更适合。进程池会预先创建一定数量的进程,任务到来时就将其分配给空闲的进程执行,避免反复创建和销毁进程的开销。

线程池的使用:

from concurrent.futures import ThreadPoolExecutor, as_completed, wait, ALL_COMPLETED


def test(a):
    print(f'一个假的进程任务{a}')
    return a

def add_thread():
    threads_list = [i for i in range(10)]
    th_executor = ThreadPoolExecutor(max_workers=10)
    for i in threads_list:
        # 线程池执行任务方法1
        th_executor.submit(test, i)
    # 线程池执行任务方法2
    th_executor.map(test, threads_list)

    # 线程池获取结果方法1:使用as_completed方法,然后用其result属性输出结果
    all_thread = [th_executor.submit(test, i) for i in threads_list]
    results1 = [j.result() for j in as_completed(all_thread)]
    print('result1结果:', results1)
	# result1结果: [3, 0, 2, 4, 1, 5, 6, 8, 9, 7]

    # 线程池获取结果方法2
    results2 = [k for k in th_executor.map(test, threads_list)]
    print('results2结果:', results2)
    # results2结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    # 也可以使用等待函数,fs:任务序列;timeout任务最大等待时间,在规定时间内,任务未执行完成也会停止;
    # return_when:wait返回结果的条件,默认为ALL_COMPLETED,全部执行完成再返回
    # 譬如,此处以下的代码是展示wait的用法
    # task_list = th_executor.map(test, threads_list)
    # 等待任务完成
    # wait(task_list)
    # 任务完成之后再进行结果的获取
    # task_result = [k for k in task_list]


if __name__ == '__main__':

    add_thread()


由result1结果和result2结果可知,使用submit方法执行任务的顺序是不固定的,使用map方法执行任务的顺序是固定的。

进程池的用法:和线程池是一样的;进程池用的是with方法去展示的,也可以用线程池的那种方法是使用,当然线程池的也可以用with方法去使用。

from concurrent.futures import ProcessPoolExecutor, as_completed, wait, ALL_COMPLETED

def test(a):
    print(f'一个假的线程任务{a}')
    return a

def add_process():
    with ProcessPoolExecutor(max_workers=8) as pool:
        process_list = [i for i in range(10)]
        for i in process_list:
            # 进程池执行任务方法1
            pool.submit(test, i)
        # 进程池执行任务方法2
        pool.map(test, process_list)

        # 进程池获取结果方法1:使用as_completed方法,然后用其result属性输出结果
        all_process = [pool.submit(test, i) for i in process_list]
        results1 = [j.result() for j in as_completed(all_process)]
        print('result1结果:', results1)
        # results1结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

        # 进程池获取结果方法2
        results2 = [k for k in pool.map(test, process_list)]
        print('results2结果:', results2)
    	# results2结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

        # 也可以使用等待函数,fs:任务序列;timeout任务最大等待时间,在规定时间内,任务未执行完成也会停止;
        # return_when:wait返回结果的条件,默认为ALL_COMPLETED,全部执行完成再返回
        # 譬如,此处是展示wait的用法
        # task_list = pool.map(test, process_list)
        # # 等待任务完成
        # wait(task_list)
        # # 任务完成之后再进行结果的获取
        # task_result = [k for k in task_list]



if __name__ == '__main__':

    add_process()

由result1结果和result2结果可知,使用submit方法执行任务的顺序和使用map方法执行任务的顺序都是固定的。

到此这篇关于python进程池和线程池的区别的文章就介绍到这了,更多相关python进程池和线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析python实现Lasso回归

    解析python实现Lasso回归

    Lasso是一个线性模型,它给出的模型具有稀疏的系数。接下来通过本文给大家分享python实现Lasso回归的相关知识,感兴趣的朋友一起看看吧
    2019-09-09
  • 关于python中导入文件到list的问题

    关于python中导入文件到list的问题

    这篇文章主要介绍了关于python中导入文件到list的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • python计算方程式根的方法

    python计算方程式根的方法

    这篇文章主要介绍了python计算方程式根的方法,涉及Python数学运算的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Python 实现Excel XLS和XLSX格式相互转换问题

    Python 实现Excel XLS和XLSX格式相互转换问题

    本文介绍如何使用Python库Spire.XLS for Python实现Excel文件的XLS和XLSX格式转换,提供了详细的安装指南和转换步骤,帮助用户在不同版本的Excel文件格式之间灵活转换,同时支持将Excel文件转换为PDF、图片、HTML等格式
    2024-10-10
  • django 连接数据库出现1045错误的解决方式

    django 连接数据库出现1045错误的解决方式

    这篇文章主要介绍了django 连接数据库出现1045错误的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • pygame游戏之旅 如何制作游戏障碍

    pygame游戏之旅 如何制作游戏障碍

    这篇文章主要为大家详细介绍了pygame游戏之旅的第6篇,教大家如何制作游戏障碍,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 基于Python实现体育彩票选号器功能代码实例

    基于Python实现体育彩票选号器功能代码实例

    这篇文章主要介绍了基于Python实现体育彩票选号器功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • python 计算文件的md5值实例

    python 计算文件的md5值实例

    下面小编就为大家带来一篇python 计算文件的md5值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Python中循环引用(import)失败的解决方法

    Python中循环引用(import)失败的解决方法

    在python中常常会遇到循环import即circular import的问题,下面这篇文章主要给大家介绍了关于Python中循环引用(import)失败的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2018-04-04
  • 简单的连接MySQL与Python的Bottle框架的方法

    简单的连接MySQL与Python的Bottle框架的方法

    这篇文章主要介绍了简单的连接MySQL与Python的Bottle框架的方法,主要基于mysql-connector插件,需要的朋友可以参考下
    2015-04-04

最新评论