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发送邮件脚本
May 22 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
对Python 数组的切片操作详解
Jul 02 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
Python中shapefile转换geojson的示例
Jan 03 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
python实现图像拼接
Mar 05 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
Jul 01 Python
详解Python自动化之文件自动化处理
Jun 21 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 生成短网址原理及代码
2014/01/23 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
python实现的希尔排序算法实例
2015/07/01 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
python 实现倒排索引的方法
2018/12/25 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
python能做哪方面的工作
2020/06/15 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
Java面试题:为什么要用Java
2012/05/11 面试题
甜美蛋糕店创业计划书
2014/01/30 职场文书
2015年父亲节寄语
2015/03/23 职场文书
百年孤独读书笔记
2015/06/29 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
redis复制有可能碰到的问题汇总
2022/04/03 Redis