博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python类库32[多进程]
阅读量:6005 次
发布时间:2019-06-20

本文共 2264 字,大约阅读时间需要 7 分钟。

由于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进程结束就退出了。 

 

完! 

转载地址:http://wfsmx.baihongyu.com/

你可能感兴趣的文章
JavaScript基础---函数
查看>>
前端每日实战:120# 视频演示如何用纯 CSS 创作锡纸撕开的文字效果
查看>>
Laravel实用小功能
查看>>
matplotlib绑定到PyQt5(有菜单)
查看>>
利用Powershell和ceye.io实现Windows账户密码回传
查看>>
Windows 8.1 今年 1 月市场份额超 Vista
查看>>
《设计团队协作权威指南》—第1章1.5节总结
查看>>
Chair:支付宝前端团队推出的Node.js Web框架
查看>>
《Total Commander:万能文件管理器》——第3.8节.后续更新
查看>>
BSD vi/vim 命令大全(下)[转]
查看>>
css3中变形与动画(一)
查看>>
[XMove-自主设计的体感解决方案] 系统综述
查看>>
【LINUX学习】磁盘分割之建立primary和logical 分区
查看>>
【YUM】第三方yum源rpmforge
查看>>
IOS(CGGeometry)几何类方法总结
查看>>
才知道系列之GroupOn
查看>>
⑲云上场景:超级减肥王,基于OSS的高效存储实践
查看>>
linux kswapd浅析
查看>>
变更 Linux、Ubuntu 时区、时间
查看>>
高仿QQ空间 侧滑Menu效果且换肤功能《IT蓝豹》
查看>>