转载自:http://www.ibm.com/developerworks/cn/aix/library/au-multiprocessing/

学习使用 Python 2.6 管理一组进程

简介

在 IBM® developerWorks® 的 早期文章 中,我演示了使用 Python 实现线程式编程的一种简单且有效的模式。但是,这种方法的一个缺陷就是它并不总是能够提高应用程序的速度,因为全局解释器锁(Global Interpreter Lock,GIL)将线程有效地限制到一个核中。如果需要使用计算机中的所有核,那么通常都需通过 对 经常使用 fork 操作来实现,从而提高速度。处理进程组是件困难的事情,因为为了在进程之间进行通信,需要对所有调用进行协调,这通常会使事情变得更复杂。

幸运的是,自 2.6 版本起,Python 包括了一个名为 “多进程(multiprocessing)” 的模块来帮助处理进程。该进程模块的 API 与线程 API 的工作方式有些相似点,但是也存在一些需要特别注意的不同之处。主要区别之一就是进程拥有的一些微妙的底层行为,这是高级 API 永远无法完全抽象出来的。可以从多进程模块的官方文档中了解有关这方面内容(参见 参考资料 小节)。

fork简介

进程和线程在并发性的工作原理方面存在一些明显的差异。通过阅读我撰写的有关线程的 developerWorks 文章,可以进一步了解这些差异(参见 参考资料)。在进程执行 fork 时,操作系统将创建具有新进程 ID 的新的子进程,复制父进程的状态(内存、环境变量等)。首先,在我们实际使用进程模块之前,先看一下 Python 中的一个非常基本的 fork 操作。

fork.py

#!/usr/bin/env python"""A basic fork in action"""import osdef my_fork():child_pid = os.fork()if child_pid == 0:print "Child Process: PID# %s" % os.getpid()else:print "Parent Process: PID# %s" % os.getpid()if __name__ == "__main__":my_fork()

现在来看一下以上代码的输出:

mac% python fork.py
Parent Process: PID# 5285
Child Process: PID# 5286

在下一个示例中,增强初始 fork 的代码,并设置一个环境变量。该环境变量随后将被复制到子进程中。下面给出了相应的代码:

示例 1. Python 中的 fork 操作

#!/usr/bin/env python"""A fork that demonstrates a copied environment"""import os
from os import environdef my_fork():environ['FOO']="baz"print "FOO environmental variable set to: %s" % environ['FOO']environ['FOO']="bar"print "FOO environmental variable changed to: %s" % environ['FOO']child_pid = os.fork()if child_pid == 0:print "Child Process: PID# %s" % os.getpid()print "Child FOO environmental variable == %s" % environ['FOO']else:print "Parent Process: PID# %s" % os.getpid()print "Parent FOO environmental variable == %s" % environ['FOO']if __name__ == "__main__":my_fork()

下面给出了 fork 的输出:

mac% python env_fork.py
FOO environmental variable set to: baz
FOO environmental variable changed to: bar
Parent Process: PID# 5333
Parent FOO environmental variable == bar
Child Process: PID# 5334
Child FOO environmental variable == bar

在输出中,可以看到 “修改后的” 环境变量 FOO 留在了子进程和父进程中。您可以通过在父进程中再次修改环境变量来进一步测试这个示例,您将看到子进程现在是完全独立的,它有了自己的生命。注意,子进程模块也可用于 fork 进程,但是实现方式没有多进程模块那么复杂。

多进程简介

现在您已经了解 Python fork 操作的基本知识,让我们通过一个简单例子了解它在更高级的多进程库中的使用。在这个示例中,仍然会出现 fork,但是已经为我们处理了大部分标准工作。

示例 2. 简单的多进程

#!/usr/bin/env python
from multiprocessing import Process
import os
import timedef sleeper(name, seconds):print 'starting child process with id: ', os.getpid()print 'parent process:', os.getppid()print 'sleeping for %s ' % secondstime.sleep(seconds)print "Done sleeping"if __name__ == '__main__':print "in parent process (id %s)" % os.getpid()p = Process(target=sleeper, args=('bob', 5))p.start()print "in parent process after child process start"print "parent process about to join child process"p.join()print "in parent process after child process join" print "parent process exiting with id ", os.getpid()print "The parent's parent process:", os.getppid()

如果查看输出,将会看到下面的内容:

mac% python simple.py
in parent process (id 5245)
in parent process after child process start
parent process about to join child process
starting child process with id:  5246
parent process: 5245
sleeping for 5
Done sleeping
in parent process after child process join
parent process exiting with id  5245
The parent's parent process: 5231

可以看到从主进程分出了一个子进程,该子进程随后休眠了 5 秒种。子进程分配是在调用 p.start() 时发生的。在下一节中,您将看到这个基础的程序将扩展为更大的程序。

使用 Python 实现多进程相关推荐

  1. Python multiprocess 多进程模块

    转发:http://www.langzi.fun/Python multiprocess 多进程模块.html 需要注意的是,如果使用多线程,用法一定要加上if __name__=='__main__ ...

  2. Python TimedRotatingFileHandler 多进程环境下的问题和解决方法

    Python TimedRotatingFileHandler 多进程环境下的问题和解决方法 原文:https://my.oschina.net/lionets/blog/796438 Python ...

  3. python 利用多进程实现文件的拷贝

    python 利用多进程实现文件的拷贝 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37338590/article/details/784 ...

  4. python多进程优化_『Python』多进程处理

    尝试学习python的多进程模组,对比多线程,大概的区别在: 1.多进程的处理速度更快 2.多进程的各个子进程之间交换数据很不方便 多进程调用方式 进程基本使用multicore() 进程池优化进程的 ...

  5. python中多进程+协程的使用以及为什么要用它

    前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...

  6. python多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  7. python爬虫多进程_Python爬虫技术--基础篇--多进程

    要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...

  8. Python使用多进程提高网络爬虫的爬取速度

    多线程技术并不能充分利用硬件资源和大幅度提高系统吞吐量,类似需求应使用多进程编程技术满足. 以爬取中国工程院院士简介和照片为例,参考代码如下,请自行分析目标网页结构并与参考代码进行比对.另外需要注意, ...

  9. python分布式多进程框架 Ray

    全栈工程师开发手册 (作者:栾鹏) python教程全解 并行和分布式计算是现代应用程序的主要内容.我们需要利用多个核心或多台机器来加速应用程序或大规模运行它们.网络爬虫和搜索所使用的基础设施并不是在 ...

  10. python + selenium多进程爬取淘宝搜索页数据

    python + selenium多进程爬取淘宝搜索页数据 1. 功能描述 按照给定的关键词,在淘宝搜索对应的产品,然后爬取搜索结果中产品的信息,包括:标题,价格,销量,产地等信息,存入mongodb ...

最新文章

  1. 流式抗体选择时需要留意的事项
  2. 第一次安装Intellij IDEA过程中遇到的坑
  3. 一个释放临时表空间的实例
  4. 你知道我们在等你吗?
  5. kayui进行添加_关于layui 实现点击按钮添加一行(方法渲染创建的table)
  6. gitservergitlab之搭建和使用
  7. linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件
  8. 【chorme插件开发】第二节:插件的配置文件说明及素材
  9. 二、Zabbix-zabbix server部署-LNMP
  10. 代码生成利器-NCodeGenerate 教程(2) NCodeGenerate的代码公用之一
  11. mex 1 hello,world
  12. Builder和Factory模式区别
  13. 公众号数据分析总结怎么做?教你玩转公众号后台数据
  14. discuz php单页,Discuz! 单页制作教程
  15. Windows 2003 Server报 由于这台计算机没有远程桌面客户端访问许可证
  16. java中手机号码的正则校验
  17. C#理论 —— 文件操作、委托和事件
  18. Android 动画之一 Drawable Animation —— 逐帧(Frame)动画
  19. Neo4j-Cypher
  20. 数据结构(C语言版)之栈及递归

热门文章

  1. HDU 2224 The shortest path
  2. HDU 6165 FFF at Valentine
  3. markdown编辑器 使用语法
  4. smarty变量调节器
  5. Django(1.7 part1)
  6. (转)ElasticSearch教程——汇总篇
  7. 大屏做成这样,领导不重用你都难
  8. (转)SpringMVC学习(五)——SpringMVC的参数绑定
  9. 天地图专题四:在天地图上显示运行轨迹
  10. Matplotlib 中文用户指南 4.1 文本介绍