并发编程-多进程
发布时间:2021-01-08 06:44:09 所属栏目:系统 来源:网络整理
导读:一.进程 新进程的创建都是由一个 已经存在的进程 执行了一个 用于创建进程的系统调用 而创建的。 1.在UNIX中:fork会创建一个与父进程一摸一样的副本 2.在Windows:系统调用CreateProcess创建进程 进程的状态 程序遇到IO操作(Input、output),会阻塞,IO完成
互斥锁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.效率低(共享数据基于文件,而文件是硬盘上的数据) (编辑:焦作站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |