python多线程与多进程

Posted 河南骏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多线程与多进程相关的知识,希望对你有一定的参考价值。

最近在单机服务器上用python跑一个机器学习模型,数据量在千万级别,运行时间跑了1个半小时,而且服务器的CPU利用率很低。就想到用多线程和多进程来并行加速跑程序,原先就只知道一点模糊的概念,还没有真正实现过,趁着这个机会就好好研究下python的多线程和多进程。

多线程

python的多线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global interpreter lock。任何python线程执行前,必须获得GIL锁,然后执行每执行100字节码,解释器自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁,实际上把所有线程的执行代码都上了锁,所以多线程在python中只能交替运行;即使100个线程跑在100核CPU上,也只能用到一个核。

多进程

一个进程在接到新任务时,就可以复制出一个子进程,来处理新任务。

多线程与多进程的区别

  1. 线程在同一个内存空间中运行;进程有独立的内存。

  2. 线程间共享对象更容易,但必须采取额外的措施来进行对象同步,确保两个线程不会同时写入同一个对象,不会发生竞态条件。

  3. 由于对象同步增加了编程开销,多线程变成更容易出错,另一房买呢,多进程编程则很容易实现。

  4. 与进程相比,线程的开销更低,生成进程比线程花更多的时间。

  5. 由于python GIL的局限性,线程无法利用多个CPU内核实现真正的并行化,而多进程则没有任何这样的限制。

  6. 进程调度有OS处理,而线程调度有python解释器来完成

  7. 子进程是可以中断、终止的,而子线程则不是,必须等待线程中止或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多线程与多进程的主要内容,如果未能解决你的问题,请参考以下文章

python之多线程与多进程

Python 多线程与多进程

Python — 多线程与多进程

python-学习-python并发编程之多进程与多线程

Python多进程与多线程

Python多线程与多进程