python多进程操作实例


Posted in Python onNovember 21, 2014

由于CPython实现中的GIL的限制,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。

一、多进程

process的成员变量和方法:

>>class multiprocessing.Process([group[, target[, name[, args[, kwargs]]]]]) 来的定义类似于threading.Thread。target表示此进程运行的函数,args和kwargs表示target的参数。

>>name, pid

分别表示进程的名字,进程id。

>> daemon成员

daemon标志位bool变量,需要在start()调用前设置。daemon的初始值是从父进程继承而来。当一个进程结束的时候,它尝试去结束它的所有的daemon子进程。

注意:

daemon进程不允许创建子进程。否则当daemon进程结束的时候它的子进程不能被结束。

这里的daemon不是Unix的daemon进程,当父进程结束的时候所有的daemon子进程也将被终止(对于非daemon进程,父进程不等待非daemon的紫子进程,除非显示地对非daemon子进程使用join()方法)。

>>  exitcode

如果进程还没有退出,则为None,如果正确的退出则为0,如果有错误则为>0的错误代码,如果进程为终止则为-1*singal。 

>> start(), is_live(), terminate()

start()用来启动进程,is_live()用来查看进程的状态,terminate()用来终止进程。

>> run()

可以在process的子类中重载run()方法,从而设定进程的任务。重载process是构造新进程的另一种方式,一定程度上上等价于process的target参数。

multiprcessing的静态方法:

>>  multiprocessing.cpu_count()

用来获得当前的CPU的核数,可以用来设置接下来子进程的个数。

>>  multiprocessing.active_children()

用来获得当前所有的子进程,包括daemon和非daemon子进程。

实例:

import multiprocessing

import time

import sys
def worker(num):

    p = multiprocessing.current_process()

    print ('Starting:' + p.name + ":" + str(p.pid))

    print(str(num))

    sys.stdout.flush()

    print ('Exiting :' + p.name + ":" + str(p.pid))

    sys.stdout.flush()
def daemon():

    p = multiprocessing.current_process()

    print ('Starting:' + p.name + ":" + str(p.pid))

    sys.stdout.flush()

    time.sleep(10)

    print ('Exiting :' + p.name + ":" + str(p.pid))

    sys.stdout.flush()

    

def non_daemon():

    p = multiprocessing.current_process()

    print ('Starting:' + p.name + ":" + str(p.pid))

    sys.stdout.flush()

    time.sleep(20)

    print ('Exiting :' + p.name + ":" + str(p.pid))

    sys.stdout.flush()

    

if __name__ == '__main__':

    w = multiprocessing.Process(name='worker', target=worker, args=(100,))

    d = multiprocessing.Process(name='daemon', target=daemon)

    d.daemon = True

    nd = multiprocessing.Process(name='non-daemon', target=non_daemon)

    w.start()

    d.start()

    nd.start()

    

    print("the number of CPU is " + str(multiprocessing.cpu_count()))

    print("All children processes:")

    for p in multiprocessing.active_children():

        print("child:" + p.name + ":" + str(p.pid))

    print()

    

    w.join()

    #d.join()

运行结果:

python多进程操作实例

可以从上面的例子看到没有多非daemon子进程使用join()方法,结果父进程没有等待非daemon进程结束就退出了。

Python 相关文章推荐
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python实现一个Git日志统计分析的小工具
Dec 14 Python
详解python中的线程
Feb 10 Python
python 匹配url中是否存在IP地址的方法
Jun 04 Python
用pycharm开发django项目示例代码
Jun 13 Python
python连接mysql有哪些方法
Jun 24 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
python如何设置静态变量
Sep 07 Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 Python
python实现手机推送 代码也就10行左右
Apr 12 Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 #Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 #Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 #Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 #Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 #Python
Python实现的下载8000首儿歌的代码分享
Nov 21 #Python
Python常用模块介绍
Nov 21 #Python
You might like
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
MSN消息提示类
2006/09/05 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
微信小程序 出现错误:{"baseresponse":{"errcode":-80002,"errmsg":""}}解决办法
2017/02/23 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
Django 返回json数据的实现示例
2020/03/05 Python
空中乘务员岗位职责
2014/03/08 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
文化建设工作方案
2014/05/12 职场文书
客户答谢会活动方案
2014/08/31 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
小学运动会前导词
2015/07/20 职场文书
家访教师心得体会
2016/01/23 职场文书