二十二:Python之多进程

2020-04-14  本文已影响0人  项啊丑

程序:是一个指令的集合

进程:正在执行的程序;或者说,当你运行一个程序,你就启动了一个进程

多进程中,每个进程所有数据(包括全局变量)都各自拥有一份,互不影响

Python中使用多进程需要用到multiprocessing模块,这个模块中封装了很多多进程的方法。

Process常用方法

p.start():启动进程,并调用该子进程中的p.run()方法

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

p.terminate():强制终止进程,不会进行任何清理操作

p.js_alive():如果p仍然运行,返回True;用来判断进程是否还在运行

p.join([timeout]):主进程等待p终止,timeout是可选的超时时间

进程池

进程池:用来创建多个进程

当需要创建子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但如果是上百个上千个目标,手动的去创建进程的工作量巨大,此时就可以利用到multiprocessing模块提供的Pool。

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果进程池还没满,那么就会创建一个新的进程来执行请求;但是如果进程池中的进程数达到了最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行。

Pool常用函数解析:

apply_async(self, func, args=(), kwds={}, callback=None, error_callback=None):使用非阻塞方式调用func(并行执行,堵塞方式为必须等待上一个进程退出后才执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表

close():关闭Pool,使其不在接收新的任务

terminate():不管任务是否完成,立即终止

join():主进程堵塞,等待子进程的退出,必须在closeterminate之后

进程间通信-Queue

多进程之间,默认是不共享数据的

通过Queue(队列Q)可以实现进程间的数据传递

Q本身是一个消息队列

如何添加消息(入队操作):

可以使用multiprocessing模块的Queue实现多进程之间的数据传递

初始化Queue()对象时(例如:q = Queue() ),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接收的消息没有上限

Queue.qsize():返回当前队列包含的消息数量

Queue.empty():如果队列为空,返回True

Queue.full():如果队列满了,返回True

Queue.get(block, timeout):获取队列中的一条消息,然后将其从队列中移除,block默认值为True

    -如果block使用默认值,切没有设置timeout(单位秒),消息队列如果为空,此程序将被阻塞(停在读取状态),知道从消息队列读到消息为止,如果设置了timeout,则会等待timeout秒,若还是没有读取到消息,则抛出‘Queue.Empty’异常

    -如果block值为False,消息队列如果为空,则会立刻抛出‘Queue.Empty’异常

进程池间通信-Queue

进程池创建的进程之间通信:如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue,而不是multiprocessing.Queue()

上一篇 下一篇

猜你喜欢

热点阅读