进程与线程的区别&在python中的使用

1 “系统中”进程与线程的区别

进程和线程的主要差别在于它们是不同的操作系统资源管理方式

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;

线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,

所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。【???】

Multiprocessing

It is the use of two or more CPUs units within a single computer system. It is the best approach to get the full potential from our hardware by utilizing full number of CPU cores available in our computer system.

Multithreading

It is the ability of a CPU to manage the use of operating system by executing multiple threads concurrently. The main idea of multithreading is to achieve parallelism by dividing a process into multiple threads.

 

ps:并行与并发区别:下边的例子虽有偏颇但是容易理解,重点是“同时”,两个单元同时进行(两张嘴,一张回电话一张吃饭)。

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。

所以我认为它们最关键的点就是:是否是『同时』。

作者:「已注销」
链接:https://www.zhihu.com/question/33515481/answer/58849148
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ps:在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为(处理器)独立运行和独立调度的基本单位 。(ref:https://www.nowcoder.com/questionTerminal/800009d83fdd423bbba4967bbd63a7bd

 

2 python中的多线程与多进程

要了解python中多线程与多进程的使用,首先要了解python中的GIL(Global Interpreter Lock)机制。

python GIL,简单来就是“互斥锁”(mutex,Mutual exclusion)或者“锁”(lock),用于使得只有一个线程可以行驶python interpreter的使用权。这意味着在任何时间点都只有一个线程可以处于执行状态。即使在一个拥有多CPU核心的多线程架构,GIL一次也只允许一个线程执行,所以GIL作为python“臭名昭著”的特性而出名。

GIL解决了python的什么问题?

Python使用引用计数进行内存管理。当在python中建立一个object时,拥有一个变量来追踪记录指向object引用的个数。当这个计数为0时,这个object占用的memory就被释放了。这里有一个简单的例子:

>>> import sys
>>> a = []
>>> b = a
>>> sys.getrefcount(a)
3

在上面这个例子中,这个空列表[]的引用计数为3,被a,b,和输给sys.getrefcount()的参数引用。

以上存在的问题是这个引用计数变量需要被保护起来防止多个线程同时增加减少它的数值。如果出现这种情况,会使你的python programs出现很多的bugs(e.g., it can cause either leaked memory that is never released or, even worse, incorrectly release the memory while a reference to that object still exists. This can cause crashes or other “weird” bugs in your Python programs.)。

通过给所有跨线程共享的数据结构加锁,引用计数变量可以被保护起来,不会被不一致地修改。如果给每个object都添加锁的话,也会引发其他的问题(Deadlocks or decreased performance)。GIL是interpreter 自身的一个单独的锁,它设定的规则是任何python bytecode的执行都需要获取这个interpreter lock。这样防止了Deadlocks也不会引入过多的性能开销。但这就使所有的CPU-bound的项目单线程了。

(GIL只是解决上述问题的一种途径,其他语言也有使用其他方法来解决的如垃圾回收。但这样可能导致单线程的性能降低)

 

GIL为什么被选择为解决方案?

用Larry Hastings的话说,GIL也是使python如此流行的原因之一。主要是当时python开发时硬件性能并没有那么强,还没有thread的概念,python设计的初衷是简单易用使开发更加快速。人们正在为现有的C库编写大量的扩展,这些扩展是python所需要的,这些C扩展又需要GIL提供的线程安全的内存管理来防止不一致的修改。

。。。。。。不想搬运了[烈推] -。- 总结就是由于GIL的存在导致python多线程无法并行只能并发(我个人理解,如有问题请指出)

 

如何应对python的GIL?

1 Multi-processing vs multi-threading:

最流行的方法是使用多进程方法,即使用多个进程而不是线程。每个Python进程都有自己的Python解释器和内存空间,所以GIL不会成为问题。Python有一个multiprocessing模块,可以让我们轻松地创建这样的进程。

时间并不能成比例地减少,因为进程管理有其自己的开销。多进程比多线程笨重,因此请记住,这可能会成为扩展瓶颈。

Alternative Python interpreters: 

Python有多种解释器实现。最受欢迎的分别是用C,Java,C#和Python编写的CPython,Jython,IronPython和PyPy。GIL仅存在于原始Python实现中,即CPython。如果你的程序及其库可用于其他解释器实现,则也可以尝试一下。

Just wait it out:

 

 

 

 

对Multiprocessing Module – Pool Class的定义:If we talk about simple parallel processing tasks in our Python applications, then multiprocessing module provide us the Pool class.(Pool只是针对相同的并行多进程,不同的还得用Process之类的类)

 

这块说白了还是没太懂,转专业的盆友基础还是不扎实需要弥补,未完待续。。。。。。

【4】讲的还比较透彻,直接引过来,里边也有多线程的介绍

 

参考资料:

【1】https://blog.csdn.net/mxsgoden/article/details/8821936

【2】https://www.tutorialspoint.com/concurrency_in_python/concurrency_in_python_multiprocessing.htm

【烈推】:https://realpython.com/python-gil/

【4】https://juejin.im/post/6844903838000873485

Guess you like

Origin blog.csdn.net/Eric_Evil/article/details/109637482