进程详解
并行与并发怎么理解?
并发:当前任务数多于处理器的核心数,称之为并发
并行:当前任务数少于或等于处理器核心数,称之为并行
为了充分利用多核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学习笔记,好像很久没有更文了,不是因为懒,因为咸鱼在学习。
领取专属 10元无门槛券
私享最新 技术干货