最近射雕英雄传很火,里面的周伯通武功很高,会左右互搏,两只手能同时打出两套拳法,威力非常猛,其实就是一种并发。Python里的并发编程除了多线程之外,还有多进程和协程.(协程上一篇我们已经讲过了), 有同学会说多买几个多核的CPU计算机,不就可以并行处理了,还要这么多条条框框干嘛(土豪同学请你不要捣乱),好 下面我们会分几篇文章来详细讲一下Python里的并发编程:
下面是一张Python并发编程总览图

那么我们实行并发有哪些方法呢:
-
多进程
-
多线程
-
协程
-
以上几种组合
今天我们先来讲多进程
1.什么是进程
简单说:一个任务就是一个进程(Process),比如打开一个Word就启动了一个Word进程,或者打开一个IE浏览器就启动了一个浏览器进程
-
其实计算机程序只是存储在磁盘上的可执行二进制(或其他类型)文件。
-
只有把它们加载到内存中并被操作系统调用,才拥有其生命期。
-
进程则是一个执行中的程序。
-
每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据,操作系统管理其上所有进程的执行,并为这些进程合理地分配时间
2.Python中创建进程
1).用os模块
最普通的方法就是用os模块里面的system函数,直接去执行命令
import os
print os.system('dir')
-
当然也可以用os里面的exec函数
-
另外也可以用os.fork(),这个跟其他的主流语言很类似,我就不多说了,而且有一个很大的缺点不能跨平台,只能在unix/linux上运行
2).用Multiprocessing模块
Multiprocessing是Python中比较常用的一个管理多进程的包
-
从Py2.6开始引入的,可以轻松完成从单进程到并发执行的转换.
-
multiprocessing模块提供了一个Process类来代表一个进程对象.
下面的例子演示了创建个函数并将其作为单个进程

>>
Start Thu Mar 02 13:54:28 2017
hello python
End Thu Mar 02 13:54:31 2017
我们在创建子进程的时候,只需要传入一个执行函数和参数(注意这个参数是一个元组,当你只有一个参数的时候后面一定要加逗号), 然后就可以创建一个Process实例了
-调用start()是启动进程
-调用join()是等待子进程结束
3).创建多个函数并将其作为多个进程
下面我们来创建个多进程,也是用multiprocessing.Process来生成进程对象,生成两个进程,让两个进程同时工作,然后用join()阻塞,直至完成.

>>
Parent process id:8496
Run child process func1 at:Thu Mar 02 17:12:41 2017
End func1 at:Thu Mar 02 14:02:43 2017
Run child process func2 at:Thu Mar 02 17:12:41 2017
End func2 at:Thu Mar 02 17:12:45 2017
Process END
3.进程间通信
Process之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipe等多种方式来交换数据.
1).用Queue
queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。put方法用来插入数据到队列中,get方法可以从队列读取并且删除一个元素
-
创建一个Queue对象,然后把它塞进两个进程里面,作为传递数据的媒人
-
队列里面放3个task,worker不断的put,consumer不断的get
-
当Queue为空的时候,就会抛出异常,我们用try/except捕捉一下,然后退出while.

>>
Worker process:13692,at:Thu Mar 02 17:17:58 2017
Worker put task1 into the queue
Worker put task2 into the queue
Worker put task3 into the queue
Consumer process:3036,at:Thu Mar 02 17:17:58 2017
Consumer get task1 from queue
Consumer get task2 from queue
Consumer get task3 from queue
Queue is empty at:Thu Mar 02 17:17:58 2017
2).用Pipe()
multiprocessing.Pipe()即管道模式,调用Pipe()返回管道的两端的connection(conn1, conn2)代表一个管道的两个端
-
Pipe仅仅适用于只有两个进程之间的对话,其中又分单双工情况
-
Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息

-
创建一个管道,一头是send_conn,另一头是recv_conn
-
父进程负责发送数据,receiver子进程负责收数据,当父进程发送完毕之后,就会调用关闭管道,如果管道已经被关闭,那么子进程recv会抛出EOFError
-
当我们捕捉到异常后,就停止发送数据
好了Py thon中的并发编程-进程入门篇就讲到这里啦,是不是觉得蛮好玩的, 进程里面还有一些其他的概念,进程池啊,Event同步通信,进程锁,原理和线程很类似,等后面讲完线程后,一起找些好的例子给大家实战讲解一下.
希望能给初学者一些启发,若有什么不懂的 ,也可以留言跟我探讨交流.
下面是我公号赞助商,希望大家多多支持一下
公号赞助商100offer
优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。
扫描下方二维码,注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!

欢迎大家关注 菜鸟学Python",更多好玩有趣的 Python原创教程,趣味算法,经验技巧,行业动态,尽在菜鸟学Python ,一起来学python吧
历史人气文章
来源 | 菜鸟学Python
作者 | xinxin
本文章为菜鸟学Python独家原创稿件,未经授权不得转载