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获取文件版本信息、公司名和产品名的方法
Oct 05 Python
Python批量按比例缩小图片脚本分享
May 21 Python
Python制作简单的网页爬虫
Nov 22 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
kali中python版本的切换方法
Jul 11 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
May 25 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 Python
python3代码中实现加法重载的实例
Dec 03 Python
python 逐步回归算法
Apr 06 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中$this->含义分析
2009/11/29 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
关于js数组去重的问题小结
2014/01/24 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
js时间控件只显示年月
2017/01/08 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python求众数问题实例
2014/09/26 Python
python2.7安装图文教程
2018/03/13 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
python读取ini配置文件过程示范
2019/12/23 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
python集合的新增元素方法整理
2020/12/07 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
十岁生日同学答谢词
2014/01/19 职场文书
2016年寒假生活小结
2015/10/10 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
vue实现列表垂直无缝滚动
2022/04/08 Vue.js