当前位置: 首页 > news >正文

python多进程优化_python多进程操作实例

由于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()

运行结果:

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Sun培训开放日归来
  • html5代码_HTML5与HTML之间有什么区别?
  • nginx动静分离配置_nginx实现动静分离的负载均衡集群
  • 乌龙钻白玉 白虎卧沙滩
  • js代码效率和java代码执行效率哪个更高_这35个Java代码优化细节,你用了吗?
  • DSP TMS320F2812的SPI使用总结
  • python dict遍历_python实现dict版图遍历
  • 2007年技术图书出版,我们有多少“第一本”?
  • python 截取_python中截取
  • wegame系统推荐头像_国产单机游戏《九霄缳神记》正式发售:登陆Steam/WeGame双平台...
  • 常用端口号大全
  • 安卓判断控件是否已经获得焦点_DevExpress 通用控件系列(4):SimpleButton
  • 创建索引视图时提示架构绑定无效,名称必须由两部分构成
  • python读取表格方法_python读取Excel表格文件的方法
  • 艰难的shader系统(三)--前期计划
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • django开发-定时任务的使用
  • Javascript基础之Array数组API
  • Java深入 - 深入理解Java集合
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS数组方法汇总
  • oschina
  • passportjs 源码分析
  • Selenium实战教程系列(二)---元素定位
  • Vue ES6 Jade Scss Webpack Gulp
  • 开源SQL-on-Hadoop系统一览
  • 一个项目push到多个远程Git仓库
  • 一文看透浏览器架构
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​力扣解法汇总946-验证栈序列
  • ‌移动管家手机智能控制汽车系统
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ()、[]、{}、(())、[[]]命令替换
  • (12)Hive调优——count distinct去重优化
  • (Ruby)Ubuntu12.04安装Rails环境
  • (七)Knockout 创建自定义绑定
  • (三)elasticsearch 源码之启动流程分析
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Scala的“=”符号简介
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • *1 计算机基础和操作系统基础及几大协议
  • .FileZilla的使用和主动模式被动模式介绍
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net Winform开发笔记(一)
  • .net 无限分类
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • @Bean, @Component, @Configuration简析
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @NestedConfigurationProperty 注解用法
  • @RequestParam详解
  • [100天算法】-目标和(day 79)
  • [30期] 我的学习方法