join
主进程等待子进程运行结束后再运行
from multiprocessing import Process
import time
def func(name, i):
print('%s 进程 running'%name)
time.sleep(i)
print('%s 进程 over'%name)
if __name__ == '__main__':
p1 = Process(target=func, args=('A',1))
p2 = Process(target=func, args=('B',2))
p3 = Process(target=func, args=('C',3))
start_time = time.time()
p1.start()
p2.start()
p3.start()
p2.join()
p1.join()
p3.join()
print('主进程')
print(time.time() - start_time)
'''
B 进程 running
A 进程 running
C 进程 running
A 进程 over
B 进程 over
C 进程 over
主进程
3.1728098392486572
'''
进程间数据隔离
进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术
这个技术是为了避免进程A写入进程B的情况发生。 进程的隔离实现,使用了虚拟地址空间。进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B
进程隔离的安全性通过禁止进程间内存的访问可以方便实现
from multiprocessing import Process
n=100
def work():
global n
n=0
print('子进程内: ',n)
if __name__ == '__main__':
p=Process(target=work)
p.start()
p.join()
print('主进程内: ',n)
>>>
子进程内: 0
主进程内: 100
僵尸进程
1.子进程运行结束,但占用的空间没有让出来("死了,没死干净") 2.所有的子进程都会经历僵尸进程的阶段 3.有害:占用资源 4.僵尸进程是正常的运行过程,目的是为了让父进程查看子进程的状态 5.父进程结束前会将子进程占用的资源回收
孤儿进程
1.父进程结束,子进程没有结束 2.无害
守护进程 p.daem = True
1.当子进程执行的任务在父进程代码运行完毕后就没有存在的必要了,那么该子进程就应该设置为守护进程 2.被守护的子进程应该在p.start()之前设置 3.被守护的子进程内不能再开启子进程 体现为:主进程代码运行结束,子进程就结束
from multiprocessing import Process
import time
def func(name):
print('%s running'%name)
time.sleep(3)
print('over')
if __name__ == '__main__':
p = Process(target=func, args=('waller',))
p.daemon = True
p.start()
time.sleep(1) # 由于是守护进程,主进程运行结束,子进程就被清空,所以要等待操作系统创建子进程并运行
print('主进程')
>>>
waller running
主进程
进程对象及其他方法
os.getpid() 当前进程的pid
os.getppid() 当前进程的父进程pid
p.terminate() 杀死p进程,告诉操作系统帮你杀死一个进程
p.is_alive() 判断p进程是否存活,返回bool值
def func(name):
print('%s 进程 running'%name, '%s 进程 %s'%(name, os.getpid()), '父进程%s'%os.getppid())
time.sleep(3)
print('%s 进程 over'%name)
if __name__ == '__main__':
p = Process(target=func, args=('w',))
p.start()
print('父进程%s'%os.getpid(), '父父进程%s'%os.getppid())
>>>
父进程5224 父父进程10332
w 进程 running w 进程 1912 父进程5224
w 进程 over
os.getpid() 当前进程的pid
os.getppid() 当前进程的父进程pid
p.terminate() 杀死p进程,告诉操作系统帮你杀死一个进程
p.is_alive() 判断p进程是否存活,返回bool值
def func(name):
print('%s 进程 running'%name, '%s 进程 %s'%(name, os.getpid()), '父进程%s'%os.getppid())
time.sleep(3)
print('%s 进程 over'%name)
if __name__ == '__main__':
p = Process(target=func, args=('w',))
p.start()
print('父进程%s'%os.getpid(), '父父进程%s'%os.getppid())
>>>
父进程5224 父父进程10332
w 进程 running w 进程 1912 父进程5224
w 进程 over