进程与线程 并发与并行python
进程与线程安全
首先要理解的是,咱们的软件都是运行在操做系统之上,操做系统再控制硬件,好比 处理器、内存、IO设备等。操做系统为了向上层应用程序提供 简单一致 的机制来控制复杂而又截然不同的低级硬件设备 抽象出 进程 的概念。进程是比较重量级的操做系统资源,它拥有独立的内存空间,而在 现代操做系统中为了实如今一个进程中执行多种任务,所以实现了 线程。 一个 进程 能够由多个 线程组成,每一个 线程 是一个执行单元,线程 运行在 进程 的上下文环境中,并共享 一样的代码和全局数据。
咱们常常说的 多线程 就是指的 在一个进程内有多个线程在执行任务,在实际开发中,开发者写的代码其实都是在线程的环境中执行的,而在多线程开发中,常常涉及到 一些 线程安全的问题,简单的看下进程 和 线程占有的资源状况多线程
简单的理解 线程安全 的问题:多线程程序在运行时候,可能会同时对一个变量进行操做,操做的时候,通常线程会将这个变量的值 copy 到 自身线程的巨变变量中,再进行操做,此时可能就会发生 读写时数据不一样步(数据已经被其余线程操做了,自身线程操做时读取的值已是旧的了)的问题。并发
并发与并行 操作系统
进程 能够申请和拥有系统资源,进程是一个实体,程序的执行依赖于、主存(存放程序和程序处理的数据) CPU(执行代码) 等…(好比IO),而进程至关于一个环境,是控制这些操做系统硬件的实体,在操做系统中,一个系统上能够运行多个进程,运行的进程通常是多于运行它们的CPU 个数的, 因此一般一个CPU 可能须要运行多个进程任务,一个CPU 就像是一个工人,他一个时间节点只能作一件事情,因此 CPU 得频繁的在多个 进程中切换(上下文切换),这种现象就是并发执行。
并行执行的概念是指 多个程序在多个CPU上同时执行,“并行” 概念是 并发 概念的一个子集,咱们能够编写一个 并行程序,可是若是没有足够的 CPU 来执行,那么最终就变成了并发执行.net
并发:同时有不少任务须要作,能够串行执行也能够并行执行
并行:能够同时(严格意义上的)作多个任务线程
做者:zhuoxiuwu
来源:CSDN
原文:https://blog.csdn.net/zhuoxiu...
版权声明:本文为博主原创文章,转载请附上博文连接!设计
----------------------------------------
----------------------------------------blog
有句行话: “python下多线程是鸡肋,推荐使用多进程!”
为何呢?进程
看两点:
一、GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所作的决定。
二、每一个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来说都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)
在Python多线程下,每一个线程的执行方式:
1.获取GIL
2.执行代码直到sleep或者是python虚拟机将其挂起。
3.释放GIL
可见,某个线程想要执行,必须先拿到GIL,咱们能够把GIL看做是“通行证”,而且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不容许进入CPU执行。
因此python里,不管如何都无法GIL致使的同一时间只能执行一个线程的问题,因此效率依然不尽如人意。
又有名言: “python下想要充分利用多核CPU,就用多进程”。
这又是为何呢?
缘由是:每一个进程有各自独立的GIL,互不干扰,这样就能够真正意义上的并行执行,因此在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。
做者:知我莫言
来源:知乎
原文:https://zhuanlan.zhihu.com/p/...
本身总结一下:
一个process只有一个GIL
一个process能够理解成 a bundle of threads
一个 CPU core 在某一时刻,只能有一个thread。
所以一个 CPU core 在某一时刻,天然也只能有一个Process。
可是不一样的cpu core能够同时有同一个Process假设有 4核CPU 和 4个processCPU0,CPU1,CPU2, CPU3 能够同时处理 process0