进程:
进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机(SymmetricalMulti-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构)的出现,可以满足多个运行单位,而多进程并行开销过大。 这个时候就引入了线程的概念。 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合 和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。 线程没有自己的系统资源,只拥有在运行时必不可少的资源。但线程可以与同属与同一进程的其他线程共享进程所拥有的其他资源。
进程与线程之间的关系
线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。
创建一个进程:
创建进程需要用到multprocessing ,multiprocess是python的进程管理包,和threading.Thread类似,直接从侧面用multiprocess替换线程使用GIL的方式,由于这一点,multprocess模块可以让程序员在给定的机器上充分利用CPU.
在multiprocess,通过Process创建进程,调用start()方法来启动进程。
import multiprocessing, time, os def run(name): time.sleep(1) print('hello',name) if __name__ =='__main__': #通过Process创建进程,与创建线程差不多 p = multiprocessing.Process(target=run, args=('body',)) p.start() p.join()
而且,每一个进程,都是由父进程所创建。
import multiprocessing, time, os def info_(title): print(title) print('module name:', __name__) print('parents pid = ', os.getppid()) #获取父进程的id print('Process id = ', os.getpid()) #获取自己进程的id print('\n') def f(name): info_('the funcation called info') print('name = ',name) if __name__ =='__main__': # 这里我们需要知道,每一个线程都是被父线程创建的。 # 进程id获取 info_('Process') p = multiprocessing.Process(target=f, args=('body',)) p.start() p.join()
join()方法实现进程间的同步(阻塞当前主进程,在调用join方法的[进程]结束之后,在继续执行主进程,且都是进程调用start()之后再调用join())
参考链接
>>>
Process
module name: __main__
parents pid = 560
Process id = 3727 #被创建的进程id
the funcation called info
module name: __main__
parents pid = 3727 #通过子进程再创建一个进程
Process id = 3728