multiprocessing模块介绍
Python中多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程,Python提供了multiprocessing。
multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
multiprocessing模块的功能众多:支持子进程,通信和共享数据,执行不同形式的同步,提供了process、Queue、Lock等组件。
需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限与该进程内。
由该类实例化得到的对象,表示一个子进程中的任务,其中需要使用关键字的方式来指定参数,args指定的为传给target函数的位置参数,是一个元组形式,必须有逗 。
参数说明:
常用属性说明:
常用方法
multiprocessing 使用函数创建多进程
注意:在windows中process()必须放到 if __name__ == ‘__main__’:
multiprocessing 使用类创建多进程
在下面的例子中,我们继承了 Process 这个类,然后重写了run方法。打印出来了进程名称和任务名称。
Deamon 进程守护
每个线程都可以单独设置它的属性,如果设置为True,当父进程结束后,子进程会自动被终止。如下代码,调用的时候增加了设置deamon。
因为主进程没有做任何事情,直接输出一句话结束,所以在这时也直接终止了子进程的运行。最后输出Exiting Main Process。接下来,我们让主进程做点事情,如下
那么如果我们让所有子进程都执行完了然后再结束,该怎么处理,只需要加入join()方法,这样父进程(主进程)就会等待子进程执行完毕,如下:
所有子进程都执行完毕之后,父进程最后打印出了结束的信息。
Lock 锁
进程之间数据隔离,数据不共享,但是共享同一套文件系统,因而可以通过文件来实现进程直接的通信,但必须自己加锁进行处理。
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,牺牲了运行效率,但保证了数据安全。
虽然可以用文件共享数据实现进程间通信,但问题是:
为此multiprocessing模块为我们提供了基于消息的IPC通信机制:队列。
Queue 进程间通信
我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题。
Queue模块中的常用方法:
如上通过添加q.put(None) 作为信 ,当所有的包子都生产完成了之后就在队列里最后加上这个None信 ,当顾客从队列里拿到这个信 的时候,就表示已经没有包子了,进程退出。但当做个消费者时,要加两个 q.put(None) 因为这里模拟2个消费者,如果只有1个None信 ,但消费者拿到第一个None之后,他知道没有了就会退出进程,但是第二个消费者就拿不到了,所以就会一直在哪里等待,导致程序卡死,所以有多少个消费者就需要多少个信 。那么有没有其他方式能够简化这种操作?——JoinableQueue。
JoinableQueue(N个生产者和N个消费者)
JoinableQueue与Queue一样也是multiprocessing模块中的一个类,也可以用于创建进程队列。
JoinableQueue 创建可连接的共享进程队列,队列允许队列的消费者通知生产者,队列数据已被成功处理完成。通知过程是使用共享的信 和条件变量来实现的。
JoinableQueue除了与Queue相同的方法之外,还具有2个特有的方法:
希望对你有所帮助,若感兴趣 、点赞支持。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!