一、回顾多继承的概念。
由于GIL(全局解释器锁)的存在,在python中无法实现真正的多线程(一个进程里的多个线程无法在cpu上并行执行),如果想充分的利用cpu的资源,在python中需要使用进程。
二、multiprocessing模块的简介。
multiprocessing是python中用来管理多进程的包,与threading用法非常类似,它主要使用multiprocessing.Process对象来创建一个进程对象,该进程可以运行在python的函数中。
该Process(进程)对象与Thread(线程)对象的用法基本相同,同样具有start,join,run之类的方法,此外,multiprocessing也具有event,Lock,Semaphore,Condition类,这些对象可以像多线程那样,通过参数传递给各个进程。
其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换成了多进程。
三、多进程的调用方式。
方式1:
#!/usr/local/bin/python2.7
# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
def func1(name):
print ‘hello %s,%s‘ %(name,time.ctime())
time.sleep(1)
if __name__ == ‘__main__‘:
pro_list = []
for i in range(3):
p = Process(target=func1,args=str(i))
pro_list.append(p)
p.start()
for i in pro_list:
i.join()
print "ending...."
方式2:(通过类的方式来创建多进程。)
#!/usr/local/bin/python2.7
# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
class myprocess(Process):
def __init__(self):
super(myprocess, self).__init__()
def run(self):
print "hello,%s,%s" %(self.name,time.ctime())
time.sleep(1)
if __name__ == ‘__main__‘:
pro_list = []
for i in range(3):
p = myprocess()
p.start()
pro_list.append(p)
for p in pro_list:
p.join()
print "ending!"
下面还有一个扩展示例,可以瞬间让你明白,父进程与子进程之间的关系。
#!/usr/local/bin/python2.7
# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
import os
def info(title):
print "title:%s" %(title)
print "parent process:%s", os.getppid() #获得父进程的进程号也就是ppid
print "process id: %s", os.getpid() #获得当前进程的pid号
def func1(name):
info("func1")
print "hello %s" %(name)
if __name__ == ‘__main__‘:
info("main process")
time.sleep(1)
print "------------------"
p = Process(target=info,args=(‘su‘,))
p.start()
p.join()
输出结果:
title:main process
parent process:%s 40833 #主进程的父进程是pycharm,所以这个是pycharm的进程号
process id: %s 42454 #我们运行的py程序的进程号
------------------
title:su
parent process:%s 42454 #在主进程中又开了个子进程,所以这个子进程的父进程就是我们运行py文件的主进程号
process id: %s 42455 #子进程自己的pid。
三、Process类的常用属性以及方法的介绍。
- Process类在实例化对象的时候,都需要哪些参数?
Process([group [, target [, name [, args [, kwargs]]]]])
group:这个参数应该是指定一个进程组,这个参数的功能暂时还没有实现,所以必须是None(默认就是None)
target:这个进程所要执行的函数或者方法。
name:指定进程名 (也可以用来获取进程名)
args/kwargs:要传到函数里的参数。
2.关于进程对象的一些常用方法。
is_alive(): 返回这个进程是否在运行状态。
join(timeout):阻塞父进程,一直到这个子进程终止。
start():开启这个进程,等待cpu调度。
terminate() 直接对这个进程发起一个SIGTERM信号,立刻终止这个进程。
3.进程类的一些常用属性。
deamon (注意!这是一个property特殊属性,本质上是个函数)daemon属性用来创建一个守护进程。 (这个守护进程是用于守护父进程的,当父进程退出,这个守护进程也会退出。)
name 获得进程名。
pid 获得进程号。