并发编程-多进程(3)
发布时间:2021-01-07 09:21 所属栏目:52 来源:网络整理
导读:互斥锁vs join的区别一: 大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序 区别:join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行 # 三个同事 同时用一个打印机打印内
互斥锁vs join的区别一: # 三个同事 同时用一个打印机打印内容. # 三个进程模拟三个同事,输出平台模拟打印机. # # 版本一: from multiprocessing import Process import time import random import os def task1(): print(f‘{os.getpid()}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{os.getpid()}打印结束了‘) def task2(): print(f‘{os.getpid()}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{os.getpid()}打印结束了‘) def task3(): print(f‘{os.getpid()}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{os.getpid()}打印结束了‘) if __name__ == ‘__main__‘: p1 = Process(target=task1) p2 = Process(target=task2) p3 = Process(target=task3) p1.start() p2.start() p3.start()不加锁,效率高,但是容易出错 from multiprocessing import Process import time import random import os def task1(p): print(f‘{p}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{p}打印结束了‘) def task2(p): print(f‘{p}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{p}打印结束了‘) def task3(p): print(f‘{p}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{p}打印结束了‘) if __name__ == ‘__main__‘: p1 = Process(target=task1,args=(‘p1‘,args=(‘p2‘,args=(‘p3‘,)) p2.start() p2.join() p1.start() p1.join() p3.start() p3.join()使用join,保证了执行顺序,但是顺序是人为,有失公平 from multiprocessing import Process from multiprocessing import Lock import time import random import os def task1(p,lock): ‘‘‘ 一把锁不能连续锁两次 lock.acquire() lock.acquire() lock.release() lock.release() ‘‘‘ lock.acquire() print(f‘{p}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{p}打印结束了‘) lock.release() def task2(p,lock): lock.acquire() print(f‘{p}开始打印了‘) time.sleep(random.randint(1,3)) print(f‘{p}打印结束了‘) lock.release() def task3(p,3)) print(f‘{p}打印结束了‘) lock.release() if __name__ == ‘__main__‘: mutex = Lock() p1 = Process(target=task1,mutex)) p2 = Process(target=task2,mutex)) p3 = Process(target=task3,mutex)) p2.start() p1.start() p3.start()使用lock锁,保证了执行顺序和公平性 四.进程间通信我们知道,进程之间内存隔离,是不能共享内存中的数据的(例:py文件中的数据),但是可以共享磁盘上的文件。 1.基于文件通信? 这里利用抢票举例子:在多个进程修改一个数据资源时,要保证顺序,一定要串行。如在抢票过程中,查看票应该并发,抢票(写入文件)应该串行。 文件实现进程间通信缺点: 1.效率低(共享数据基于文件,而文件是硬盘上的数据) (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读