Python学习之多进程详解

进程详解

并行与并发怎么理解?

并发:当前任务数多于处理器的核心数,称之为并发

并行:当前任务数少于或等于处理器核心数,称之为并行

为了充分利用多核CPU资源,Python中大部分情况下都需要使用多进程。

在python中我们如何创建多进程?

进程和线程的区别

我们经常迷惑于多进程和多线程,长的好像一样,但是他们有本质上的区别,很多大佬也对进程和线程的概念做了很多通俗易懂的解释,这里我们引用阮一峰老师的博文,大家可以先去看看,理清楚线程和进程的区别。

进程与线程的一个简单解释(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html)

python如何创建多进程

创建多进程的方法有什么区别?

使用os 模块中的 os.fork()创建进程

在这里使用os.fork()创建进程后会返回两个值,其中一个值为零。另一个值为创建的子进程ID,在这里可以使用os.getpid()获取子进程的ID,可以使用os.getppid()获取父进程ID。

需要注意的是:在os.fork()创建的子进程中,父进程和子进程执行的是一样的任务,并且在执行的任务结束时,父进程会自行结束,不会等待子进程结束之后结束。

使用multiprocessing模块创建多进程

其中:

同时在Process类中提供以下几个方法用于实现进程的操作:

举个栗子:

使用multiprocessing中的Pool类创建进程池对象

使用Pool类创建进程的方法和使用Process类创建进程的方法基本类似。

但是需要注意一下几点:

举个栗子:

进程之间如何通信?

进程间通信有很多中方式,包含但不限于命名管道,无名管道,共享内存,队列等。主要学习一下队列-Queue的使用

Queue的使用

首先实例化Queue对象,例如:p = Queue(num)其中num可以为空或负数代表可接受的消息无上限。

如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出Queue.Empty异常;如果block值为False,消息列队如果为空,则会立刻抛出Queue.Empty异常;

举个栗子:

再举个栗子:

进程池中的Queue的使用

Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:

举个栗子:

写在后面

这是咸鱼的第一篇python学习笔记,好像很久没有更文了,不是因为懒,因为咸鱼在学习。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180620G202O800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券