一 守护进程:
守护进程也就是一个进程会随着另一个进程(被守护进程)的结束而结束:
from multiprocessing import Process import time def func(name): time.sleep(2) print('%s is running'%name) if __name__ == '__main__': # t=Process(target=func,args=('feng',)) t=Process(target=func,kwargs={'name':'feng'}) t.daemon=True#我们通过把子进程变成守护进程。 t.start() print('zhu'.center(50,'*')) 输出结果:***********************zhu************************
从结果我们可以看出,主进程一结束,子进程就结束。
二 互斥锁:保证每一个我们的子进程完整的运行完之后才会运行下一个子进程,但是在当前子进程阻塞的时候可以去进行新的子进程的创建。
from multiprocessing import Process,Lock import time import random mutex=Lock() def task1(lock): lock.acquire()#不能连续的acquire,必须抢一次,释放一次才能继续抢。 print('task1:name1') time.sleep(random.randint(1,2)) print('task1:age1') time.sleep(random.randint(1, 2)) print('task1:sex1') time.sleep(random.randint(1, 2)) lock.release() def task2(lock): lock.acquire() print('task1:name2') time.sleep(random.randint(1, 2)) print('task1:age2') time.sleep(random.randint(1, 2)) print('task1:sex2') time.sleep(random.randint(1, 2)) lock.release() def task3(lock): lock.acquire() print('task1:name3') time.sleep(random.randint(1, 2)) print('task1:age3') time.sleep(random.randint(1, 2)) print('task1:sex3') time.sleep(random.randint(1, 2)) lock.release() if __name__ == '__main__': p1=Process(target=task1,args=(mutex,)) p2=Process(target=task2,args=(mutex,)) p3=Process(target=task3,args=(mutex,)) p1.start() p2.start() p3.start()
我们从multiprocessing模块导入Lock,通过Process实例化出三个对象p1,p2,p3,这三个对象在执行的时候就是三个进程,互斥锁会保证三个进程之间公平竞争cpu资源
join与互斥锁的区别:二者原理一样,把并发变成串行,保证有序,join人为的指定顺序
应该谁先启动谁先来用,如果使用join那么我们的顺序就固定了,必须p1先开始
而互斥锁是所有的进程平等的争抢,谁先抢到谁先用。抢到之后运行完了一定要要释放,要不然别的进程没办法拿到锁。
我们使用join同样可以实现一个串行的效果:
from multiprocessing import Process import time import random def task1(): print('task1:name1') time.sleep(random.randint(1,2)) print('task1:age1') time.sleep(random.randint(1, 2)) print('task1:sex1') time.sleep(random.randint(1, 2)) def task2(): print('task1:name2') time.sleep(random.randint(1, 2)) print('task1:age2') time.sleep(random.randint(1, 2)) print('task1:sex2') time.sleep(random.randint(1, 2)) def task3(): print('task1:name3') time.sleep(random.randint(1, 2)) print('task1:age3') time.sleep(random.randint(1, 2)) print('task1:sex3') time.sleep(random.randint(1, 2)) if __name__ == '__main__': p1=Process(target=task1,) p2=Process(target=task2,) p3=Process(target=task3,) p1.start() p1.join() p2.start() p2.join() p3.start() p3.join()
三 基于互斥锁模拟抢票系统:
互斥锁可以有选择的让一部分代码(修改共享数据的代码)串行。而join则让所有的代码都按照一个确定的顺序运行。
#文件db的内容为:{"count":1} #注意一定要用双引号,不然json无法识别 from multiprocessing import Process,Lock import time,json,random def search(): dic=json.load(open('db.txt')) print('