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

拥有一个多进程程序:

  

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 __author__ = 'Eva_J'
 4 import multiprocessing
 5 import time
 6
 7 def func(msg):
 8     for i in range(3):
 9         print msg
10         time.sleep(1)
11
12 if __name__ == "__main__":
13     p = multiprocessing.Process(target=func, args=("hello", ))
14     p.start()
15     p.join()
16     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).大概就是说,如果我们必须确定当前已经引入了主模块,来避免一些非预期的副作用。。。总之,加上!就对了!!!
进程池:

  

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

multiprocessing Pool Code

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

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

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

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

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

  

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 __author__ = 'Eva_J'
 4 import multiprocessing
 5 import time
 6
 7 def func(msg):
 8     print "msg : ", msg
 9     time.sleep(3)
10     print "end"
11     return "multi_result : " + msg
12
13 if __name__ == "__main__":
14     pool = multiprocessing.Pool(processes=4)
15     result = []
16     for i in xrange(3):
17         msg = "hello %d" %(i)
18         multi_result = pool.apply_async(func, (msg, ))
19         result.append(multi_result)
20     pool.close()
21     pool.join()
22     for res in result:
23         print res.get()
24     print "have done."

multiprocessing get result example Code

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

进程之间的内存共享:

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

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

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

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

Array Code

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 __author__ = 'Eva_J'
 4 #方法二:manage.dict()共享数据
 5 from multiprocessing import Process,Manager
 6
 7 manage = Manager()
 8
 9 dic = manage.dict()
10
11 def Foo(i):
12     dic[i] = 100+i
13     print dic.values()
14
15 if __name__ == "__main__":
16     for i in range(2):
17         p = Process(target=Foo,args=(i,))
18         p.start()
19         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  

转载于:https://www.cnblogs.com/Eva-J/p/5110844.html

python——进程基础相关推荐

  1. Python基础38(进程基础)

    进程基础 基础概念 进程定义:只有在运行当中的程序叫进程 操作系统与进程的关系:操作系统调用一个程序,就是进程 为何进入进程概念:隔离资源 ps:进程是操作系统中资源分配最小单位 进程的调度方法: 1 ...

  2. Python 进程池 multiprocessing.Pool - Python零基础入门教程

    目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...

  3. Python 进程 Process 与线程 threading 区别 - Python零基础入门教程

    目录 一.Python 线程 threading 创建 二.Python 进程 Process 创建 三.Python 进程 Process 和线程 threading 区别 四.Python 进程 ...

  4. Python 进程 Process 模块 - Python零基础入门教程

    目录 一.Python 进程 Process 简介 二.Python 进程 Process 模块 三.Python 进程 Process 函数介绍 四.Python 进程 Process 使用 五.P ...

  5. Python 进程互斥锁 Lock - Python零基础入门教程

    目录 一.Python 线程互斥锁和进程互斥锁 1.创建线程互斥锁 2.创建进程互斥锁 二.进程互斥锁 Lock 函数介绍 三.进程互斥锁 Lock 使用 案例一:使用进程,但不使用互斥锁 案例二:进 ...

  6. python从零基础到项目实战怎么样-2018完整Python零基础到项目精通的学习书籍

    Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏.Python编程语言的流行直线上升,如何学习好Py ...

  7. 学会python之后-python学会基础语法之后,如何提高?

    1.找到发展方向,选择合适的学习线路图 我一直都认为找到未来发展方向才是最重要的事情.我说说我自己吧,我一开始觉得python有发展方向,因为我是一个做推广的,也涉及到seo相关工作.我深知道数据的重 ...

  8. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  9. python进程join的用法_python 进程介绍 进程简单使用 join 验证空间隔离

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

最新文章

  1. Android中的URI
  2. 方差分析 球形检验_重复测量数据的方差分析
  3. python与c语言有什么区别_Python和C语言的语法有什么不同?
  4. Vue-route路由的嵌套使用
  5. StackOverflow 上面最流行的 7 个 Java 问题!| 值得一看
  6. ElementUI自定义icon步骤条
  7. Yershop商城系统
  8. python os.forkos.wait
  9. 【Python学习笔记】Coursera之PY4E学习笔记——String
  10. 详解LightGBM两大降维利器:基于梯度的单边采样(GOSS)和互斥特征捆绑(EFB)
  11. 2022年2月份谷哥学术资源分享下载列表 20/20
  12. Elasticsearch 结合dynamic-synonym实现同义词热加载
  13. YY淘宝商品数据库设计
  14. 易语言 服务器抓包,易语言调用wincap实现网卡抓包
  15. opencv检测中线
  16. 三大措施助力新华三NGFW争当市场排头兵
  17. 怎样给黑白照片上色?手把手教你上色
  18. app打包上传遇到的问题
  19. border-radius和border-image
  20. 根据PLL相噪测试曲线计算jitter的Matlab程序

热门文章

  1. oracle11g设置数据库归档,oracle_Oracle11g RAC开启关闭、设置归档小结,关闭 1.先关数据库: 复制代 - phpStudy...
  2. ggbiplot设置分组_比PCA更好用的监督排序—LDA分析、作图及添加置信-ggord
  3. vue可以多次导入吗_vue组件怎么复用,比如有abc三个组件,b是可复用组件,引入到a和c中,但是怎么才能在a和c中的数?...
  4. sql between包括两端吗_技术分享:T-SQL 之语法艺术(一)
  5. oracle删除临时表空间语句,Oracle中临时表空间的清理
  6. Git上传文件到GitHub失败问题解决
  7. deeplearning中卷积后尺寸的变化
  8. centso7.5 安装minconda3和创建项目所需python3环境
  9. sqoop从hdfs上导出数据到MySQL报错:ClassNotFoundException:allclo
  10. Python-OpenCV基本操作