一 守护进程:

守护进程也就是一个进程会随着另一个进程(被守护进程)的结束而结束:

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实现有序输出

相关文章: