进程之锁,信息量,事件,队列,生产者消费者模型,joinablequeue


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <br> #锁 import os ,random,time,json from multiprocessing import Process,Lock def qiangPiao(i): with open ( 'ticket' , 'r+' ,encoding = 'utf-8' )as f: ticket_info_dic = json.load(f) if ticket_info_dic[ 'count' ]> 0 : ticket_info_dic[ 'count' ] - = 1 # f.write(json.dumps(ticket_info_dic)) f.seek( 0 ) json.dump(ticket_info_dic,f) print ( '"id":%s "i:"%s 抢到票了 ' % (os.getpid(),i)) else : print ( '%s没票了' % i) class myProcess(Process): def __init__( self ,i,lock): super ().__init__() self .i = i self .lock = lock def run( self ): time.sleep(random.random()) self .lock.acquire() qiangPiao( self .i) self .lock.release() if __name__ = = '__main__' : with open ( 'ticket' , 'w' ,encoding = 'utf-8' )as f: f.write( '{"count":1}' ) lock = Lock() for i in range ( 9 ): p = myProcess(i,lock) p.start() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #信息量 import time,random from multiprocessing import Process,Semaphore def xijiao(i): print ( '%s号洗脚' % i) time.sleep(random.randrange( 1 , 3 )) class myProcess(Process): def __init__( self ,i,s): super (myProcess, self ).__init__() self .i = i self .s = s def run( self ): self .s.acquire() xijiao( self .i) self .s.release() if __name__ = = '__main__' : s = Semaphore( 2 ) #信号量 for i in range ( 10 ): p = myProcess(i,s) p.start() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #事件 def honglvdeng(e): while 1 : print ( '红灯' ) time.sleep( 3 ) e. set () print ( '绿灯' ) time.sleep( 3 ) e.clear() def car(e,i): if not e.is_set(): print ( '%s等待...' % i) e.wait() print ( '%s走你' % i) if __name__ = = '__main__' : e = Event() l = Process(target = honglvdeng,args = (e,)) l.start() for i in range ( 3 ): p = Process(target = car,kwargs = { 'e' :e, 'i' :i}) p.start() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #队列 import time from multiprocessing import Process,Queue # q=Queue(3) # q.put(1) # q.put(2) # q.put(3) # print('满:',q.full())#判断一个队列是否满了,不可靠 # # q.put(4)#阻塞 # print(q.get()) # print(q.get()) # print(q.get()) #print(q.qsize())#获取当前队列有多少个值,不可靠 # # print(q.get())#阻塞 # print('空:',q.empty())#判断一个队列是否为空,不可靠 # try: # q.get(False)# # q.get_nowait()#与q.get(False)一样 # except Exception as e: # print('队列空了') def boy(q): q.put( '约吗?' ) def g(q): print ( 'boy:' ,q.get()) time.sleep( 1 ) print ( '领导:' ,q.get()) if __name__ = = '__main__' : q = Queue( 4 ) p1 = Process(target = boy, args = (q,)) p1.start() p = Process(target = g,args = (q,)) p.start() time.sleep( 1 ) q.put( '不要乱搞' ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #生产者消费者模型 import time from multiprocessing import Process,Queue def makeBaozi(q): for i in range ( 1 , 11 ): time.sleep( 1 ) q.put( '%s号包子' % i) print ( '生产%s号包子' % i) def chiBaozi(q): while 1 : time.sleep( 2 ) bao = q.get() if bao = = None : break print ( '吃%s' % bao) if __name__ = = '__main__' : q = Queue( 20 ) p1 = Process(target = makeBaozi,args = (q,)) p1.start() p2 = Process(target = chiBaozi,args = (q,)) p2.start() p1.join() #主进程等待进程p1结束 q.put( None ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #生产者消费者模型,joinablequeue import time from multiprocessing import Process,JoinableQueue def makeBaozi(q): for i in range ( 1 , 11 ): time.sleep( 1 ) q.put( '%s号包子' % i) print ( '生产%s号包子' % i) q.join() print ( '吃完了' ) def chiBaozi(q): while 1 : time.sleep( 2 ) bao = q.get() print ( '吃%s' % bao) q.task_done() #发送执行完一次 if __name__ = = '__main__' : q = JoinableQueue( 20 ) #创建一个joinablequeue对象 p1 = Process(target = makeBaozi,args = (q,)) p1.start() p2 = Process(target = chiBaozi,args = (q,)) p2.daemon = True #给p2进程添加守护跟随主进程一起结束 p2.start() p1.join() #主进程等待进程p1结束 print ( '主进程结束' ) |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步