Process对象方法:
join方法:
-
在子进程执行完毕后才继续主进程执行,否则一直在原地阻塞
-
判断主进程内子进程是否执行完毕
from multiprocessing import Process
import time
import random
def task(name):
print('%s is piaoing' %name)
time.sleep(random.randint(1,3))
print('%s is piao end' %name)
if __name__ == '__main__':
p1=Process(target=task,args=('egon',))
p2=Process(target=task,args=('alex',))
p3=Process(target=task,args=('yuanhao',))
p4=Process(target=task,args=('wupeiqi',))
p1.start()
p2.start()
p3.start()
p4.start()
p.join()是让主线程等待p的结束,卡住的是主进程而绝非子进程p
进程对象的其他方法一:terminate与is_alive、
-
p.is_alive() 判断是否存在子进程
-
p.terminate() 告诉操作系统,终止子进程
from multiprocessing import Process
import time
import random
def task(name):
print('%s is piaoing' %name)
time.sleep(random.randrange(1,5))
print('%s is piao end' %name)
if __name__ == '__main__':
p1=Process(target=task,args=('egon',))
p1.start()
p1.terminate() #关闭进程不会立即关闭,所以is_alive立刻查看的结果可能还是存活
print(p1.is_alive) # 判断是否存活
进程对象的其他属性:name与pid
from multiprocessing import Process
import time
import random
def task(name):
print('%s is piaoing' %name)
time.sleep(random.randrange(1,5))
print('%s is piao end' %name)
if __name__ == '__main__':
p1=Process(target=task,args=('egon',),name='子进程1') #可以用关键参数来指定进程名
p1.start()
print(p1.name,p1.pid,)
僵尸进程: - 子进程已经结素,但是pid号为被销毁
--占用pid 进程孤儿进程
孤儿进程: - 子进程还在执行,但父进程意外结束
- 擦破做系统福利院1 --》 回收孤儿进程
守护进程: - 主进程结束后,主进程产生的子进程都结束 (daemon)
-守护进程会在主进程代码执行结束后就终止
-守护进程内无法再开启子进程,否则抛出异常
from multiprocessing import Process
import time
import random
def task(name):
print('%s is piaoing' %name)
time.sleep(random.randrange(1,3))
print('%s is piao end' %name)
if __name__ == '__main__':
p=Process(target=task,args=('egon',))
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
print('主') #只要终端打印出这一行内容,那么守护进程p也就跟着结束掉了
进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱
进程产生子进程,会在开辟一个名称空间,进程之间互不干扰!!