知行编程网知行编程网  2022-03-02 09:00 知行编程网 隐藏边栏 |   抢沙发  6 
文章评分 0 次,平均分 0.0

这是菜鸟学Python的第58篇原创文章

阅读本文大概需要5分钟

   

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

 

 

下面是一张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类来代表一个进程对象.

     

下面的例子演示了创建个函数并将其作为单个进程

 

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

>>

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()阻塞,直至完成.

 

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

>>

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.

 

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

>>

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只负责发送消息

 

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

 

  • 创建一个管道,一头是send_conn,另一头是recv_conn
  • 父进程负责发送数据,receiver子进程负责收数据,当父进程发送完毕之后,就会调用关闭管道,如果管道已经被关闭,那么子进程recv会抛出EOFError
  • 当我们捕捉到异常后,就停止发送数据

 

 


好了Python中的并发编程-进程入门篇就讲到这里啦,是不是觉得蛮好玩的, 进程里面还有一些其他的概念,进程池啊,Event同步通信,进程锁,原理和线程很类似,等后面讲完线程后,一起找些好的例子给大家实战讲解一下.

希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.

历史人气文章

九九乘法,兔子数列,杨辉三角|用Python生成器的妙解

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

用Python写个弹球的游戏

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

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

Google推出Python课堂啦

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享