进程之锁,信息量,事件,队列,生产者消费者模型,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('主进程结束')

  

 

 

posted @   冒蓝火的加特林哒哒哒  阅读(153)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示