企业应该如何建设自己的网站,网站建设公司怎样做账,2024年还有新冠吗,电子商务网络营销方式有哪些一、互斥锁进程之间数据隔离#xff0c;但是共享一套文件系统#xff0c;因而可以通过文件来实现进程直接的通信#xff0c;但问题是必须自己加锁处理。注意#xff1a;加锁的目的是为了保证多个进程修改同一块数据时#xff0c;同一时间只能有一个修改#xff0c;即串行…一、互斥锁进程之间数据隔离但是共享一套文件系统因而可以通过文件来实现进程直接的通信但问题是必须自己加锁处理。注意加锁的目的是为了保证多个进程修改同一块数据时同一时间只能有一个修改即串行的修改没错速度是慢了牺牲了速度而保证了数据安全。1.上厕所的小例子你上厕所的时候肯定得锁门吧有人来了看见门锁着就会在外面等着等你吧门开开出来的时候下一个人才去上厕所。from multiprocessing import Process,Lockimport osimport timedef work(mutex):mutex.acquire()print(‘task[%s] 上厕所‘%os.getpid())time.sleep(3)print(‘task[%s] 上完厕所‘%os.getpid())mutex.release()if __name__ ‘__main__‘:mutex Lock()p1 Process(targetwork,args(mutex,))p2 Process(targetwork,args(mutex,))p3 Process(targetwork,args(mutex,))p1.start()p2.start()p3.start()p1.join()p2.join()p3.join()print(‘主‘)2.模拟抢票(也是利用了互斥锁的原理 LOCK互斥锁)import jsonimport timeimport randomimport osfrom multiprocessing import Process,Lockdef chakan():dic json.load(open(‘piao‘,)) # 先查看票数也就是打开那个文件print(‘剩余票数%s‘ % dic[‘count‘]) # 查看剩余的票数def buy():dic json.load(open(‘piao‘,))if dic[‘count‘]0: #如果还有票dic[‘count‘]-1 #就修改里面的值-1time.sleep(random.randint(1,3)) #执行里面买票的一系列操作就先不执行了让睡一会代替(并且随机的睡)json.dump(dic,open(‘piao‘,‘w‘))print(‘%s 购票成功‘ % os.getpid()) # 当前的那个id购票成功def task(mutex): #抢票chakan() #因为查看的时候大家都可以看到不需要加锁mutex.acquire() #加锁buy() #买的时候必须一个一个的买先等一个人买完了后面的人在买mutex.release() #取消锁if __name__ ‘__main__‘:mutex Lock()for i in range(50):#让50个人去访问那个票数p Process(targettask,args(mutex,))p.start()二、Process对象的其他属性p.daemon 守护进程(必须在开启之前设置守护进程)如果父进程死子进程p也死了p.join父进程等p执行完了才运行主进程是父进程阻塞在原地而p仍然在后台运行。terminate强制关闭。(确保p里面没有其他子进程的时候关闭如果里面有子进程你去用这个方法强制关闭了就会产生僵尸进程(打个比方如果你老子挂了你还没挂那么就没人给你收尸了啊哈哈))is_alive关闭进程的时候,不会立即关闭,所以is_alive立刻查看的结果可能还是存活p.join()父进程在等p的结束是父进程阻塞在原地而p仍然在后台运行p.name查看名字p.pid 查看id我们可以简单介绍一下僵尸进程子进程运行完成但是父进程迟迟没有进行回收此时子进程实际上并没有退出其仍然占用着系统资源这样的?进程称为僵尸进程。因为僵尸进程的资源一直未被回收造成了系统资源的浪费过多的僵尸进程将造成系统性能下降所以应避免出现僵尸进程。from multiprocessing import Processimport osimport timedef work():print(‘%s is working‘%os.getpid())time.sleep(3)if __name__ ‘__main__‘:p1 Process(targetwork)p2 Process(targetwork)p3 Process(targetwork)# p1.daemon True# p2.daemon True #守护进程(守护他爹)# p3.daemon True #主进程死了子进程也死了(就不会执行子进程了)p1.start()p2.start()p3.start()p3.join()p2.join()p1.join() #多个join就是在等花费时间最长的那个运行完就执行主程序了print(‘主程序‘)# -了解方法---------------# p1.terminate() #强制关闭进程# time.sleep(3)# print(p1.is_alive()) #看是不是还活着# print(p1.name) #查看进程名字# print(p1.pid) #查看id号# print(‘主程序‘)三、进程间的三种通信(IPC)方式方式一队列(推荐使用)进程彼此之间互相隔离要实现进程间通信(IPC)multiprocessing模块支持两种形式队列和管道这两种方式都是使用消息传递的1.队列队列类似于一条管道元素先进先出需要注意的一点是队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态2.队列分类队列有很多种但都依赖与模块queuequeue.Queue() #先进先出queue.LifoQueue() #后进先出queue.PriorityQueue() #优先级队列queue.deque() #双线队列创建队列的类(底层就是以管道和锁定的方式实现)Queue([maxsize]):创建共享的进程队列Queue是多进程安全的队列可以使用Queue实现多进程之间的数据传递。参数介绍maxsize是队列中允许最大项数省略则无大小限制。方法介绍q.put方法用以插入数据到队列中put方法还有两个可选参数blocked和timeout。如果blocked为True(默认值)并且timeout为正值该方法会阻塞timeout指定的时间直到该队列有剩余的空间。如果超时会抛出Queue.Full异常。如果blocked为False但该Queue已满会立即抛出Queue.Full异常。q.get方法可以从队列读取并且删除一个元素。同样get方法有两个可选参数blocked和timeout。如果blocked为True(默认值)并且timeout为正值那么在等待时间内没有取到任何元素会抛出Queue.Empty异常。如果blocked为False有两种情况存在如果Queue有一个值可用则立即返回该值否则如果队列为空则立即抛出Queue.Empty异常.q.get_nowait():同q.get(False)q.put_nowait():同q.put(False)q.empty():调用此方法时q为空则返回True该结果不可靠比如在返回True的过程中如果队列中又加入了项目。q.full()调用此方法时q已满则返回True该结果不可靠比如在返回True的过程中如果队列中的项目被取走。q.qsize():返回队列中目前项目的正确数量结果也不可靠理由同q.empty()和q.full()一样应用#队列# 1.可以往队列里放任意类型的# 2.先进先出from multiprocessing import Process,Queueq Queue(3)q.put(‘first‘) #默认blockTrueq.put(‘second‘)q.put(‘third‘)print(q.get())print(q.get())print(q.get())