进程是程序在计算机上的一次执行活动,就是正在运行的应用程序,通常成为进程。每一个进程有自己独立的地址空间(内存空间)。
线程是一个轻量级的子进程,是最小的处理单元;线程是进程的子集,一个进程可以由多个线程组成;
多线程是指有多个线程存在于进程中,这些线程之间共享进程的资源。
进程是资源分配的最小单位,线程是CPU调度的最小单元,一个线程只能属于一个进程,一个进程可以拥有多个线程;
Python的解释器是默认为线程安全的,主要措施是GIL(全局解释性锁,Global Interpret Lock)的机制。因为GIL的存在,Python一次只能有一个线程在运行,多线程不能提高程序的性能,除非有大量的IO操作。多线程适合IO密集型,多进程适合计算密集型
在Python中,进程是通过multiprocessing多进程模块来创建的,multiprocessing提供了一个Process类来创建进程对象。Process类可以单独调用,也可以继承使用.主要操作如下:
当需要创建的⼦进程数量不多时, 可以直接利⽤multiprocessing.Process动态生成多个进程, 但如果要创建很多进程时,⼿动创建的话⼯作量会非常大,此时就可以⽤到multiprocessing模块提供的Pool去创建一个进程池。使用进程池的好处就是可以,创建有限的进程来自动并行处理大量的任务。Pool类的主要方法:
进程是系统分配资源的最小单元,进程之间相互独立,每启动一个新的进程就是相当于吧数据进行了一次克隆,子进程里面的数据修改无法影响到主进程中的数据,不同子进程之间的数据也不共享,这是多进程在使用过程中和多线程最明显的区别。由于进程之间数据是不共享的,所以不会出现多线程GIL带来的问题。python也提供了多种方法实现了多进程中间的通信和数据共享(可以修改一份数据),multiprocessing包支持两种形式多进程之间的通信:Queue和Pipe,这两种方式都是使用消息传递的。
Queue创建共享的进程队列,是多进程安全的队列,可以使用Queue实现多进程之间的数据传递,一个进程向队列中写数据,另一个进程从队列中取数据。无论主进程或子进程,都能访问到队列,放进去的对象都经过了深拷贝。
Queue([maxsize]:返回一个使用一个管道和少量锁和信号量实现的共享队列实例。当一个进程将一个对象放进队列中时,一个写入线程会启动并将对象从缓冲区写入管道中。Queue模块的方法有:
参考:https://zhuanlan.zhihu.com/p/521283266?utm_id=0