由于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进程结束就退出了。
python,多进程
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]