python多线程与多进程
Posted 河南骏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多线程与多进程相关的知识,希望对你有一定的参考价值。
最近在单机服务器上用python跑一个机器学习模型,数据量在千万级别,运行时间跑了1个半小时,而且服务器的CPU利用率很低。就想到用多线程和多进程来并行加速跑程序,原先就只知道一点模糊的概念,还没有真正实现过,趁着这个机会就好好研究下python的多线程和多进程。
多线程
python的多线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global interpreter lock。任何python线程执行前,必须获得GIL锁,然后执行每执行100字节码,解释器自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁,实际上把所有线程的执行代码都上了锁,所以多线程在python中只能交替运行;即使100个线程跑在100核CPU上,也只能用到一个核。
多进程
一个进程在接到新任务时,就可以复制出一个子进程,来处理新任务。
多线程与多进程的区别
-
线程在同一个内存空间中运行;进程有独立的内存。
-
线程间共享对象更容易,但必须采取额外的措施来进行对象同步,确保两个线程不会同时写入同一个对象,不会发生竞态条件。
-
由于对象同步增加了编程开销,多线程变成更容易出错,另一房买呢,多进程编程则很容易实现。
-
与进程相比,线程的开销更低,生成进程比线程花更多的时间。
-
由于python GIL的局限性,线程无法利用多个CPU内核实现真正的并行化,而多进程则没有任何这样的限制。
-
进程调度有OS处理,而线程调度有python解释器来完成
-
子进程是可以中断、终止的,而子线程则不是,必须等待线程中止或join。
结论:
多线程应该用于涉及IO操作密集或用户交互程序
多进程应该用于计算密集型程序。
程序的不同部分可以使用不同形式的并行化
python concurrent.future内置模块
多线程demo:
with ThreadPoolExecutor(max_workers=n) as tpe:
tpe.submit(func_name, args)
多进程demo:
with ProcessPoolExecutor(max_workers=n) as ppe:
for i in ppe.map(func_name,iterable_object):
feature_df = feature_df.append(i, ignore_index = True) #将所有结果保存到一个df或者list
其他应用可以参考官网文档:https://docs.python.org/3/library/concurrent.futures.html
以上是关于python多线程与多进程的主要内容,如果未能解决你的问题,请参考以下文章