Python 里的左右互搏武功 | 进程编程入门篇

916 阅读6分钟
原文链接: mp.weixin.qq.com

        最近射雕英雄传很火,里面的周伯通武功很高,会左右互搏,两只手能同时打出两套拳法,威力非常猛,其实就是一种并发。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生成器的妙解

一道Google的算法题 |Python巧妙破解

用Python写个弹球的游戏

如何用Python写一个每分每时每天的定时程序

Python入门原创文章,2016年度大盘点

Google推出Python课堂啦





来源 | 菜鸟学Python

作者 | xinxin

本文章为菜鸟学Python独家原创稿件,未经授权不得转载