我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了。多进程实现了多CPU的利用,效率简直棒棒哒~~~

拥有一个多进程程序:

  

 #!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'Eva_J'
import multiprocessing
import time def func(msg):
for i in range(3):
print msg
time.sleep(1) if __name__ == "__main__":
p = multiprocessing.Process(target=func, args=("hello", ))
p.start()
p.join()
print "have done."

multiprocess Code 1

  按照上面的方法,我们就在自己的代码中启动了一个子进程,需要注意的是要想启动一个子进程,必须加上那句if __name__ == "main",否则就会报错。 查看了官方文档说:Safe importing of main module,Make sure that the main module can be safely imported by a new Python interpreter without causing unintended side effects (such a starting a new process).大概就是说,如果我们必须确定当前已经引入了主模块,来避免一些非预期的副作用。。。总之,加上!就对了!!!
进程池:

  

 #!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'Eva_J'
def func(msg):
print msg,'*** in func'
time.sleep(3) if __name__ == "__main__":
#
pool = multiprocessing.Pool(processes=5)
for i in xrange(3):
print i
pool.apply_async(func, ("hello %d" %(i), ))
#pool.apply(func, ("hello %d" %(i), ))
pool.close()
#pool.terminate() #结束工作进程,不在处理未完成的任务
pool.join() #主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用
print "have done."

multiprocessing Pool Code

  上图中的方法就是进程池的使用,这里重点的介绍一些进程池相关的方法。

  首先,我们为进程注入func,有两种方式:apply_async表示异步,就是子进程接收到请求之后就各自去执行了,而apply表示同步,子进程们将一个一个的执行,后一个子进程的执行永远以前一个子进程的结束为信号,开始执行。还是吃饭的例子。。。异步就是当我通知子进程要去吃饭的时候,他们就同时去吃饭了,同步就是他们必须一个一个的去,前一个没回来,后一个就不能去。

  close方法:说关闭进程池,至此,进程池中不在有进程可以接受任务。

  terminate和join是一对方法,表示的内容截然相反,执行terminate是结束当前进程池中的所有进程,不管值没执行完。join方法是阻塞主进程,等待子进程执行完毕,再继续执行主进程。需要注意的是:这两个方法都必须在close方法之后执行。当然我们也可以不执行这两个方法,那么子进程和主进程就各自执行各自的,无论执行到哪里,子进程会随着主进程的结束而结束。。。

获取进程池中进程的执行结果:

  

 #!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'Eva_J'
import multiprocessing
import time def func(msg):
print "msg : ", msg
time.sleep(3)
print "end"
return "multi_result : " + msg if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = []
for i in xrange(3):
msg = "hello %d" %(i)
multi_result = pool.apply_async(func, (msg, ))
result.append(multi_result)
pool.close()
pool.join()
for res in result:
print res.get()
print "have done."

multiprocessing get result example Code

  没啥好说的,区别在黄框框里,自取不谢~~~

进程之间的内存共享:

  我们之前说过,正常情况下,每个进程都拥有自己的内存空间,因此进程间的内存是无法共享的。

  但是python却提供了我们方法,让我们程序的子进程之间实现简单的数据共享。

  一个是Array数组,一个是multiprocessing模块中的Manager类。需要注意的是,Array数组的大小必须固定,Manager需要在linux系统下运行。代码在下面啦!!

 #!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'Eva_J'
#方法一,Array
from multiprocessing import Process,Array
temp = Array('i', [11,22,33,44]) def Foo(i):
temp[i] = 100+i
for item in temp:
print i,'----->',item for i in range(2):
p = Process(target=Foo,args=(i,))
p.start()

Array Code

 #!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'Eva_J'
#方法二:manage.dict()共享数据
from multiprocessing import Process,Manager manage = Manager() dic = manage.dict() def Foo(i):
dic[i] = 100+i
print dic.values() if __name__ == "__main__":
for i in range(2):
p = Process(target=Foo,args=(i,))
p.start()
p.join()

Manager dict Code

参考文献:

    python进程池:http://www.cnblogs.com/kaituorensheng/p/4465768.html

    python多进程的使用示例:http://outofmemory.cn/code-snippet/2267/Python-duojincheng-multiprocessing-usage-example

      python的线程、进程和协程:http://www.cnblogs.com/wupeiqi/articles/5040827.html  

    python的内存共享:http://www.cnblogs.com/dkblog/archive/2011/03/14/1983250.html

    python的多进程编程:http://www.cnblogs.com/kaituorensheng/p/4445418.html  

python——进程基础的更多相关文章

  1. python进程基础

    目录 进程以及状态 1. 进程 2. 进程的状态 进程的创建-multiprocessing 1. 创建进程 2. 进程pid 3. Process语法结构如下 4. 给子进程指定的函数传递参数 5. ...

  2. Python学习基础笔记(全)

    换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...

  3. python 进程介绍 进程简单使用 join 验证空间隔离

    一.多道程序设计技术(详情参考:https://www.cnblogs.com/clschao/articles/9613464.html) 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行 ...

  4. (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md

    第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...

  5. python进程、多进程

    进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当 ...

  6. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  7. [ python ] 进程的操作

    目录 (见右侧目录栏导航)- 1. 前言- 2. multiprocess模块- 2.1 multiprocess.Process模块    - 2.2 使用Process模块创建进程    - 2. ...

  8. python(一):python语言基础

    一.python语言基本的8个要素 Python语言的8个要素:数据类型.对象引用.组合数据类型.逻辑操作符.运算操作符.控制流语句.输入/输出.函数的创建与引用.除此之外还有一个非常重要且无处不在的 ...

  9. Python socket 基础(Server) - Foundations of Python Socket

    Python socket 基础 Server - Foundations of Python Socket 通过 python socket 模块建立一个提供 TCP 链接服务的 server 可分 ...

随机推荐

  1. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

  2. 理解innodb buffer pool

    今天组里有个同事说可以查看innodb buffer pool每个表和索引占的大小,为此我搜了下,还真有方法,记录下. innodb buffer pool有几个目的: 缓存数据--众所周知,这个占了 ...

  3. UITableView heightForHeaderInSection遇到的坑

    出现这种现象只需要把 heightforfoot改为0.01 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSectio ...

  4. 学习Linux系列--布署常用服务

    本系列文章记录了个人学习过程的点点滴滴. 回到目录 10.mediawiki 知名开源维基框架,我用来构建自己的知识库. 在mediawiki中新建一个http.conf文件 sudo vim /op ...

  5. ftp协议详解

    客户端与服务器之间,需要多条连接才能完成应用的协议,属于复杂协议.如FTP,PPTP,H.323和SIP均属于复杂协议. 这里主要介绍ftp协议的工作原理.首先,ftp通信协议有两种工作模式,被动模式 ...

  6. EditText光标颜色设置

    又一次做应用,发现EditText没有显示光标,借鉴了网上的方法,发现是因为光标是白色的,与背景一样造成的,这里记录一下如何设置EditText等的光标颜色: 需要在布局文件中指定androd:tex ...

  7. JS写随机数

    使用JS编写一个方法 让数组中的元素每次刷新随机排列(不得使用sort方法:需注明步骤思路).例如:初始数组:a,b,c,d 每次刷新页面都会显示不同:b,c,d,a….a,d,c,b…等等 代码: ...

  8. 第1章 Sass简介

    什么是 CSS 预处理器? 定义: CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言 ...

  9. C/C++ 堆和栈的区别

    堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈. 2.堆区(h ...

  10. uwsgi出现invalid request block size: 21573 (max 4096)...skip解决办法

    buffer-size uwsgi内部解析的数据包大小,默认4k. 如果准备接收大请求,你可以增长到64k. 允许uwsgi接收到32k,更大的会被丢弃. xweb.ini [uwsgi]socket ...