Python学习之-进程

01、python之进程

进程是执行中的程序。

每一个进程都有它自己的地址空间,一般情况下,包括:

1、文本区域(text region):存储处理器执行的代码,

2、数据区域(data region):存储变量和进程执行期间使用的动态分配的内存,

3、堆栈(stack region):存储着活动过程调用的指令和本地变量。

  • 动态性:进程的实质是程序在多道程序系统中的一次执行过程,  进程是动态产生,动态消亡的。

  • 并发性:任何进程都可以同其他进程一起并发执行。

  • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

  • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。

02、multiprocessing.Process模块

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

进程对象初始化源码:

Python学习之-进程

由该Process实例化得到的对象,表示一个子进程中的任务(未启动)。

注意:

  •  必须使用关键字方式来指定参数;

  •  args指定给target函数传递的参数,元祖形式,单个参数后面必须有逗号。

参数介绍:

  • group:参数未使用,默认值为None。

  • target:表示调用对象,即子进程要执行的任务。

  • args:表示调用的位置参数元组。

  • kwargs:表示调用对象的字典。

  • name:子进程名称。

常用方法/属性:

  • start():启动进程。

  • run():进程启动时运行的方法,正是它去调用target指定的函数,自定义类的类中一定要实现该方法 。

注意:start()启动子进程执行target,run()是将target函数作为参数传递给父进程进行执行。

  • join([timeout]):主进程等待子进程终止,timeout可设置超时时间,join只能join住start开启的进程,而不能join住run开启的进程 。

  • terminate():强制终止进程,不会进行任何清理操作。如果该进程终止前,创建了子进程,那么该子进程在其强制结束后变为僵尸进程;如果该进程还保存了一个锁那么也将不会被释放,进而导致死锁。使用时,要注意。

  • is_alive():判断某进程是否存活,活True,否False。

  • daemon:默认值为False,如果设置为True,代表该进程为后台守护进程;当该进程的父进程终止时,该进程也随之终止;并且设置为True后,该进程不能创建子进程,设置该属性必须在start()之前。

Process示例:

Python学习之-进程

 

03、multiprocessing.Pool模块

pool:见名知意,进程池,

进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。

进程池对象初始化源码:

Python学习之-进程

参数介绍:

  • numprocess:要创建的进程数,默认为cpu_count()或1。

  • initializer:是每个工作进程启动时要执行的可调用对象,默认为None。

  • initargs:是要传给initializer的参数组。

  • maxtasksperchild:每个进程最大执行任务数。

  • context:用来指定启动进程的上下文,通常利用 multiprocessing.Pool()或 Pool()方法来创建进程池。在以上两种情况下,上下文都会被恰当地设置。

注意:maxtasksperchild是Python3.2版本的新特性,context 是Python3.4 的新特性。

常用方法/属性:

  1. apply(func[,args[,kwds]]):apply用于传递不定参数,同python中的apply函数一致(不过内置的apply函数从2.3以后就不建议使用了),主进程会阻塞于函数。主进程的执行流程同单进程一致。

  2. apply_async(func[,args[,kwds[,callback]]]):与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。主进程循环运行过程中不等待apply_async的返回结果,在主进程结束后,即使子进程还未返回整个程序也会退出。虽然 apply_async是非阻塞的,但其返回结果的get方法却是阻塞的,如使用result.get()会阻塞主进程。如果我们对返回结果不感兴趣, 那么可以在主进程中使用pool.close与pool.join来防止主进程退出。注意join方法一定要在close或terminate之后调用。

  3. map(func,iterable[,chunksize]):map方法与在功能上等价与内置的map(),只不过单个任务会并行运行。它会使进程阻塞直到结果返回。
    但需注意的是其第二个参数虽然描述的为iterable, 但在实际使用中发现只有在整个队列全部就绪后,程序才会运行子进程。

  4. map_async(func,iterable[,chunksize[,callback]]):与map用法一致,但是它是非阻塞的。其有关事项见apply_async。

  5. imap(func,iterable[,chunksize]):与map不同的是, imap的返回结果为iter,需要在主进程中主动使用next来驱动子进程的调用。即使子进程没有返回结果,主进程对于gen_list(l)的 iter还是会继续进行。

  6. imap_unordered(func,iterable[,chunksize]):同imap一致,只不过其并不保证返回结果与迭代传入的顺序一致。

  7. close():关闭pool,使其不再接受新的任务。

  8. terminate():结束工作进程,不再处理未处理的任务。

  9. join():主进程阻塞等待子进程的退出,join方法要在close或terminate之后使用。

pool示例

Python学习之-进程

 

睡前人工智能共享实验室新功能上线啦!

https://www.edu.futurelab.tv/