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进程池和线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python3实现raspberry pi(树莓派)4驱小车控制程序
这篇文章主要为大家详细介绍了python3实现raspberry pi(树莓派)4驱小车控制程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2020-02-02pycharm没有找到manage repositories按钮的解决办法
这篇文章主要给大家介绍了关于pycharm没有找到manage repositories按钮的解决办法,pycharm是用来写python的可视化代码软件,文中通过图文介绍的非常详细,需要的朋友可以参考下2023-07-07Python计算开方、立方、圆周率,精确到小数点后任意位的方法
今天小编就为大家分享一篇Python计算开方、立方、圆周率,精确到小数点后任意位的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-07-07Python JMESPath库轻松操作JSON进行数据查询方法实例
这篇文章主要为大家介绍了Python JMESPath库轻松操作JSON方法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2024-01-01
最新评论