Python中多进程和多线程 多线程、多进程、GIL、队列Queue的简单使用

鳄鱼君

发表文章数:643

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Python中多进程和多线程 多线程、多进程、GIL、队列Queue的简单使用

进程(process)含义

程序的执行实例称为进程

每个进程提供执行程序所需的资源。进程有虚拟地址空间、可执行代码、系统对象的打开句柄、安全上下文、惟一进程标识符、环境变量、优先级类、最小和最大工作集大小,以及至少一个执行线程。每个进程由一个线程(通常称为主线程)启动,但是可以从它的任何线程创建额外的线程。

程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。

线程(thread)含义

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

线程是一个执行上下文,它是CPU执行指令流所需的所有信息。线程以相同的方式工作。CPU给你的错觉是它在同一时间做多个计算。它通过在每次计算上花费一点时间来实现这一点。它可以这样做,因为它对每个计算都有一个执行上下文。就像你可以和朋友共享一本书一样,许多任务也可以共享一个CPU,在更技术的层面上,执行上下文(因此是线程)由CPU寄存器的值组成。线程与进程不同。线程是执行的上下文,而进程是一组与计算相关的资源。一个进程可以有一个或多个线程。

说明:与进程相关的资源包括内存页(进程中的所有线程都具有相同的内存视图)、文件描述符(例如open sockets)和安全凭据(例如,启动进程的用户的ID)。

列如我们的pycharm和qq,就可以说是两个独立的进程,我们可以在各自的进程中操作相关的指令,这些指令就可以成为线程,pycharm和qq之间互不影响,两个的内存是独立的,在pycharm这个进程里面,我们可以操作很多的指令,写代码什么的,在qq里面我们也可以操作一些指令,发消息了什么的,也就是说同一个进程之间的线程之间的内存可以共享,pycharm和qq想交流的话,就需要一个中间代理。

线程与进程的关系

  1. 线程共享创建它的进程的地址空间; 进程有自己的地址空间。
  2. 线程可以直接访问其进程的数据段; 进程有自己的父进程数据段的副本。
  3. 线程可以直接与进程中的其他线程通信; 进程必须使用进程间通信来与同级进程通信。
  4. 新线程很容易创建; 新的进程需要父进程的复制。
  5. 线程可以对同一进程的线程进行相当大的控制; 进程只能对子进程进行控制。
  6. 主线程的更改(取消、优先级更改等)可能会影响进程中其他线程的行为; 对父进程的更改不会影响子进程。

GIL(全局解释器锁)

假如我的机器是4核,那么同一时间可以执行4个任务;如果单核,我启动10个线程,看起来也是并发的,因为它是上下文切换执行的。但是单核,永远都是串行的,CPU是按照顺序执行的。4核在同一时刻真正有4个任务在执行,而不是看起来像,这就是多核的意义。

但是在Python中,无论你的机器多少核,永远都是假象,也就是说,同一时间,执行的线程只有一个。有人说Python的多线程是是假线程,16核机器启动16个线程,结果就一个在跑。但实际上效果,看起来也是并发的,这也是在不断的进行上下文切换,这就叫做全局解释器锁。


更深刻的解释:假设有个变量num=1,Python(标准的CPython)启动一个线程,交给CPU执行,我的机器和4核的,现在启动4个线程,让4核充分利用。Python想要CPU启动一个线程,必须要告诉CPU上下文关系。现在启动4个线程,让4个线程修改num变量的值,加1,最后num的结果就是4。第1个线程,将上下文交给CPU,其他线程同理,每个线程拿到的num值都是1,并且都对num进行了加1操作,最后线程返回给CPU的结果都是2。

现在我想让4个线程依次加1,而不是同时加1,解决方法就是串行,但是Python的解释器是直接调用C语言的线程接口,它自己不能控制线程的执行顺序,它只负责传递上下文,等待CPU的执行结果。当时的解决办法就是,Python自己加的全局解释器锁:同一时间,只有一个线程可以拿到数据,只有一个线程可以修改。像Java、C++可以控制线程的执行顺序,就不存在这个问题。

对于多进程和多线程的使用方法,可参考:

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Python中多进程和多线程 多线程、多进程、GIL、队列Queue的简单使用》 发布于2020-01-02

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

9 + 8 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册