首页
学习
活动
专区
工具
TVP
发布

入门Python多线程/多进程编程

微信公众号:python技术交流

如有问题或建议,请公众号留言

线程和进程

计算机,用于计算的机器。计算机的核心是CPU,在现在多核心的电脑很常见了。为了充分利用cpu核心做计算任务,程序实现了多线程模型。通过多线程实现多任务的并行执行。

现在的操作系统多是多任务操作系统。每个应用程序都有一个自己的进程。操作系统会为这些进程分配一些执行资源,例如内存空间等。在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。

线程创建之后,是有多个状态的,大概的关系如下图:

Python 多线程使用

Python提供两个模块进行多线程的操作,分别是thread和threading,前者是比较低级的模块,用于更底层的操作,一般应有级别的开发不常用。后者则封装了更多高级的接口,类似java的多线程风格,提供run方法和start调用。

执行的结果如下:

通过执行结果可以看到,启动两个进程,然后打印主进程退出,主进程等待两个线程退出之后,整个程序退出。

当我们把注释的这一段代码打开:

然后,再次执行之后,我们会看到这样的结果:

由此,我们可以看到,thread执行join之后,方法将会等待直到线程结束。这将阻塞正在调用的线程,直到被调用join()方法的线程结束。

如果修改上述的代码,在新建thread之后,添加如下两行代码:

然后再次执行,得到的结果如下:

可以看到,daemon = True的时候,进程是守护进程,在主进程退出之后,就会直接退出,不会等待子进程执行完成。

GIL 全局解释器锁

在python的世界里,对于线程,就不得不说一句GIL(全局解释器锁)。GIL的存在让python的多线程多少有点鸡肋了。Cpython的线程是操作系统原生的线程在解释器解释执行任何Python代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。因为python的进程做为一个整体,解释器进程内只有一个线程在执行,其它的线程都处于等待状态等着GIL的释放。

因此,在Python中,多线程最好用来处理I/O相关的操作,而当我们遇到计算密集型的操作的时候,Python推荐的时候使用多进程来进行处理,下面我们介绍下多进程的编程。

multiprocess 模块

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。

先看如下一个例子:

执行的结果如下:

Process的使用示例如下:

具体的执行结果,大家可以自己执行的过程中看下。

多个进程之间是可以进行通信的,目前支持两种数据交互方式,Queues和Pipe.

Pipe function默认创建的是一个全双工的管道,能够互相之间发送和接收数据。

在多进程执行的过程中,我们也可以异步的进行执行,如果我们关心执行结果,那么我们就可以对拿到的结果进行再次处理,如下面的demo程序:

执行结果如下:

上面的操作中,都使用的是多进程来进行并发处理,该模块中同样包含了对多线程的封装,只需要对上述代码做如下变动:

其他操作方式和多进程相同。

本文对进程间的通信以及相关的锁的机制没有进行深入的探讨,在后续文章中,会进行讲解。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180606G09UUD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券