首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python的多线程编程

从本节开始学习Python中的多线程编程,本节先把进程和线程的定义搞清楚,不然后面没法进行了。

进程

 在说进程之前,我们先了解一下什么是程序,程序就是我们开发人员编写好的生成可执行的二进制文件。当用到它的时候就会被加载到内存中,这个时候这个程序就拥有了生命周期。好的,那么进程的概念也就出来了,进程就是一个执行中的程序。

 在计算机中每一个进程都有自己的地址空间、内存、数据栈等等有关数据。操作系统会管理好这些进程,并合理给他们分配CPU的使用时间。

 由此也可以引出另一个问题,因为每个进程都拥有自己独立的内存等数据栈空间,所以进程之间通信只能依靠进程间通信(IPC)的方式共享信息。

线程

 其实线程也是一个小小的进程,可以把他们理解为是在一个主进程中并行运行的一些小进程。

 线程包括开始、执行顺序和结束三部分。

 一个进程中的各个小线程与主线程共享同一个数据空间,因此相对于独立的进城来说线程间的信息共享和通信会简单很多。线程一般是以并行的方式执行的,正是由于这种并行和共享机制,才使得多任务之间的协作成为可能。

 当然这种共享是有风险的,如果两个或者多个线程同时访问同一个数据空间,就有可能造成数据的不一致。这就是竞态条件。虽然有同步原语可以解决这个问题,但是我们要小心一点。

全局解释器锁

在Python的解释器中,可以运行多个线程,但是在任意给定的时刻只有一个线程会被解释器执行,就类似于单核CPU的运行机制。所以为来保证在Python虚拟机中同一时间只有一个进程运行,Python的作者提出一个锁,就是控制Python虚拟机访问的全局解释器锁(GIL)。这一点不是本节的重点,有兴趣的同学可以去自行百度一下。

退出线程

 当一个线程完成了函数的执行时,就会退出。除此之外你也可以利用一些其他手段来强制退出,不如thread.exit()、sys.exit()甚至跑出一个SystemExit异常来退出线程。

检查自己的Python解释器是否支持线程

 虽说大多数情况下都会支持,但是为了以防万一,在你编写线程的时候最好检查一下你的解释器是否支持线程,检查的方法跟前面章节提到的方法一样。直接在你的终端执行:

如果编译正常则说明你的解释器编写线程没有问题,如果报了异常或者说No module named thread则说明你的解释器有问题,暂不支持线程。最好重新安装一下Python解释器。

举例说明

上面说那么多不如我们来举个栗子:比如说我们创建两个循环,一个睡眠4秒,一个睡眠2秒。然后我们对比一下,在使用线程和不使用线程的情况下,执行这两个函数一共需要多长时间。

下面我们先看不使用线程的情况下执行的时间:

下面我们执行一下,看看运行结果:

start main at : Thu Sep 6 22:02:57 2018

start fun1 at : Thu Sep 6 22:02:57 2018

end fun1 at : Thu Sep 6 22:03:01 2018

start fun2 at : Thu Sep 6 22:03:01 2018

end fun2 at : Thu Sep 6 22:03:03 2018

end main at : Thu Sep 6 22:03:03 2018

通过上面的结果我们可以看出来,从fun1和fun2开始到结束,所使用的时间加起来一共使用了6秒。

那么我们再来看一下,使用了线程后会有什么不一样的地方:

执行以下直接看结果:

start main at : Thu Sep 6 22:16:01 2018

start fun1 at : Thu Sep 6 22:16:01 2018

start fun2 at : Thu Sep 6 22:16:01 2018

end fun2 at : Thu Sep 6 22:16:03 2018

end fun1 at : Thu Sep 6 22:16:05 2018

end main at : Thu Sep 6 22:16:07 2018

再看下这个结果,fun1和fun2所消耗的时间一共加起来也就才用了4秒。而这4秒还是人家fun1睡眠的时间。这就发现fun1和fun2其实是并行执行的,在fun1开始的时候,其实fun2也开始了。

好了,这样大家基本就明白线程在实际开发中的重要性了吧?有的同学要问了,上面的代码中为什么多了一个sleep(6)呢?为什么要让主线程睡眠6秒呢?其实这里我们让主线程睡眠6秒是为了运行结果更加直观。如果我去掉,主程序会在运行完start就会直接运行end,而不会去等待fun1和fun2的执行。主线程执行完,直接就OVER了。fun1和fun2也就不执行了。感兴趣的同学可以去掉sleep(6)试一下。那么有咩有其它什么办法解决这个问题呢?

有,这就是我们要说的锁了。时间篇幅有限,下次再说。

具体内容请关注公众号“计算机自学平台”

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券