这是菜鸟学Python的第58篇原创文章
阅读本文大概需要5分钟
下面是一张Python并发编程总览图
那么我们实行并发有哪些方法呢:
- 多进程
- 多线程
- 协程
- 以上几种组合
今天我们先来讲多进程
简单说:一个任务就是一个进程(Process),比如打开一个Word就启动了一个Word进程,或者打开一个IE浏览器就启动了一个浏览器进程
- 其实计算机程序只是存储在磁盘上的可执行二进制(或其他类型)文件。
- 只有把它们加载到内存中并被操作系统调用,才拥有其生命期。
- 进程则是一个执行中的程序。
- 每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据,操作系统管理其上所有进程的执行,并为这些进程合理地分配时间
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
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
- 当我们捕捉到异常后,就停止发送数据
好了Python中的并发编程-进程入门篇就讲到这里啦,是不是觉得蛮好玩的, 进程里面还有一些其他的概念,进程池啊,Event同步通信,进程锁,原理和线程很类似,等后面讲完线程后,一起找些好的例子给大家实战讲解一下.
希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.
历史人气文章
九九乘法,兔子数列,杨辉三角|用Python生成器的妙解
一道Google的算法题 |Python巧妙破解
用Python写个弹球的游戏
如何用Python写一个每分每时每天的定时程序
Python入门原创文章,2016年度大盘点
Google推出Python课堂啦
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python中的exp是什么10/11
- ♥ python赋值运算符的使用方法01/01
- ♥ 如何在python中导入数据08/16
- ♥ python如何读取文件名09/23
- ♥ 如何使用 pandas 连接函数 concat() 函数10/13
- ♥ 应该安装哪个版本的python09/13
内容反馈