python——进程基础
我们现在都知道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——进程基础的更多相关文章
- python进程基础
目录 进程以及状态 1. 进程 2. 进程的状态 进程的创建-multiprocessing 1. 创建进程 2. 进程pid 3. Process语法结构如下 4. 给子进程指定的函数传递参数 5. ...
- Python学习基础笔记(全)
换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...
- python 进程介绍 进程简单使用 join 验证空间隔离
一.多道程序设计技术(详情参考:https://www.cnblogs.com/clschao/articles/9613464.html) 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行 ...
- (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md
第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...
- python进程、多进程
进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当 ...
- Python文件基础操作(IO入门1)
转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...
- [ python ] 进程的操作
目录 (见右侧目录栏导航)- 1. 前言- 2. multiprocess模块- 2.1 multiprocess.Process模块 - 2.2 使用Process模块创建进程 - 2. ...
- python(一):python语言基础
一.python语言基本的8个要素 Python语言的8个要素:数据类型.对象引用.组合数据类型.逻辑操作符.运算操作符.控制流语句.输入/输出.函数的创建与引用.除此之外还有一个非常重要且无处不在的 ...
- Python socket 基础(Server) - Foundations of Python Socket
Python socket 基础 Server - Foundations of Python Socket 通过 python socket 模块建立一个提供 TCP 链接服务的 server 可分 ...
随机推荐
- 正则提取 html 里<input> 标记的value 值
获取html 标记的值: :年月日 结果:您选择的是2014年1月22日 使用了Regex 对象,得到一个 MatchCollection,然后进行处理. string mes = @"&l ...
- Vitrualbox虚拟机网络设置
来自http://www.douban.com/group/topic/15558388/ VirtualBox的提供了四种网络接入模式,它们分别是: 1.NAT 网络地址转换模式(NAT,Netwo ...
- [转] dpkg-deb命令
点击此处阅读原文 function addLink() { var body_element = document.getElementsByTagName('body')[0]; var selec ...
- Python ---list,dict,str
Python中定义常量 都用大写 Pip 安装python第三方模块的命令 一般默认都放在/python27/lib/site-pak List.count(‘元素’)-------------统计 ...
- JavaScript:this是什么?
JavaScript:this是什么?定义:this是包含它的函数作为方法被调用时所属的对象.说明:这句话有点咬嘴,但一个多余的字也没有,定义非常准确,我们可以分3部分来理解它! 1.包含它的函数.2 ...
- Web API
https://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api ...
- 逻辑回归算法的原理及实现(LR)
Logistic回归虽然名字叫"回归" ,但却是一种分类学习方法.使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素.逻辑回归(Logistic Regression, L ...
- win7的HOST文件夹具体位置
win7的HOST文件位置为C:\WINDOWS\system32\drivers\etc\文件夹下,快捷查看方法如下: 1.按win+r,输入C:\WINDOWS\system32\drivers\ ...
- 通过js引用外部脚本(嘿嘿,方便直接在浏览器上调试抓取代码)
最近折腾爬虫,后端使用jQuery进行数据采集,一般都是先从浏览器中将采集代码调试好后直接放到后端跑了. 有些网址没有引用jQuery,那调试起来就不方便了,可以用以下代码动态添加script标签,将 ...
- XML文件解析
eclipse新建源文件的文件夹,编译后和src文件夹中放在一起 源文件 源文件的配置文件 测试文件 源文件的测试文件 一般用maven进行管理的时候就是这样 如果是小项目的话可能就src和resou ...