网络编程之进阶

---恢复内容开始---

1、互斥锁

2、进程间通信

3、生成者消费者模型

1互斥锁

from multiprocessing import Process,Lock
import os
import time
def 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(target=work,args=(mutex,))#实例化一个进程
    p2=Process(target=work,args=(mutex,))#实例化一个进程
    p3=Process(target=work,args=(mutex,))#实例化一个进程
    p1.start()#启动
    p2.start()#启动
    p3.start()#启动
    print('')
    
#给子线程加上锁:就相当于子线程是串行的。

2、进程间通信

模拟抢票系统(这个版本每次只能一个进程使用)

#残次版
from multiprocessing import Process,Lock
import json
import time
import random
import os
def task(mutex):
    mutex.acquire()#获得锁
    dic=json.load(open('db.txt'))#反序列化文件
    print('剩余票数%s' %dic['count'])#打印剩余票数
    if dic['count'] > 0:#判断是有剩余的票数
        dic['count']-=1#票数减一
        time.sleep(random.randint(1,3))#睡眠一段时间
        json.dump(dic,open('db.txt','w'))#序列化保存
        print('%s 购票成功' %os.getpid())#打印购票成功
    mutex.release()#释放锁

if __name__ == '__main__':
    mutex=Lock()#生成一个锁
    for i in range(2):#循环2次
        p=Process(target=task,args=(mutex,))#生成一个线程
        p.start()#启动

模拟抢票软件完整版

from multiprocessing import Process,Lock
import json
import time
import random
import os
def search():#定义查询票数
    dic=json.load(open('db.txt',))#反序列化数据
    print('剩余票数%s' %dic['count'])#查看剩余的票数

def get_ticket():#定义购票的函数
    dic=json.load(open('db.txt',))#反序列化数据
    if dic['count'] > 0:#判断是否有票
        dic['count']-=1#票数减一
        json.dump(dic,open('db.txt','w'))#序列化数据
        print('%s 购票成功' %os.getpid())#打印哪个进程购票
def task(mutex):
    search()#查询时
    time.sleep(random.randint(1, 3)) #模拟购票一系列繁琐的过程所花费的时间
    mutex.acquire()#获得一个进程锁
    get_ticket()#购票
    mutex.release()#释放锁
if __name__ == '__main__':
    mutex=Lock()#实例化一个锁
    for i in range(5):
        p=Process(target=task,args=(mutex,))#一个进程
        p.start()#启动一个进程

3、生成者和消费者模型

队列:

from multiprocessing import Process,Queue
#1:可以往队列里放任意类型的数据 2 队列:先进先出
q=Queue(3)
q.put('first')
q.put('second')
q.put('third')
# q.put('fourht',block=False)#不是默认值就会报错
q.put('fourht')#是默认值就会夯住

print(q.get())
print(q.get())
print(q.get())

一个生成者和一个消费者模型

# from multiprocessing import Process,Queue
# import time
# import random
# import os
# def consumer(q):
#     while True:
#         res=q.get()
#         if res is None:
#             break
#         time.sleep(random.randint(1,3))
#         print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
# def producer(q):
#     for i in range(5):
#         time.sleep(2)
#         res='包子%s' %i
#         q.put(res)
#         print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
#     q.put(None)
# if __name__ == '__main__':
#     q=Queue()
#     #生产者们:厨师们
#     p1=Process(target=producer,args=(q,))
#
#     #消费者们:吃货们
#     p2=Process(target=consumer,args=(q,))
#     p1.start()
#     p2.start()
#     p1.join()#
#     p2.join()#运行完后才会执行下面的
#     print('主')

多个生成者和多个消费者

#几个消费者,有几个None
from multiprocessing import Process,Queue
import time
import random
import os
def consumer(q):
    while True:
        res=q.get()
        if res is None:break
        time.sleep(random.randint(1,3))
        print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
def product_baozi(q):
    for i in range(3):
        time.sleep(2)
        res='包子%s' %i
        q.put(res)
        print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
def product_gutou(q):
    for i in range(3):
        time.sleep(2)
        res='骨头%s' %i
        q.put(res)
        print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
def product_ganshui(q):
    for i in range(3):
        time.sleep(2)
        res='泔水%s' %i
        q.put(res)
        print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
if __name__ == '__main__':
    q=Queue()
    #生产者们:厨师们
    p1=Process(target=product_baozi,args=(q,))
    p2=Process(target=product_gutou,args=(q,))
    p3=Process(target=product_ganshui,args=(q,))
    #消费者们:吃货们
    p4=Process(target=consumer,args=(q,))
    p5=Process(target=consumer,args=(q,))
    p_l=[p1,p2,p3,p4,p5]
    for p in p_l:
        p.start()
    #
    # for p in p_l:
    #     p.join()

    #
    # p1.start()
    # p2.start()
    # p3.start()
    # p4.start()
    # p5.start()


    p1.join()
    p2.join()
    p3.join()
    q.put(None)
    q.put(None)
    p4.join()
    p5.join()
    print('主')
 

另一种方法写一个生成者和一个消费者

from multiprocessing import Process,JoinableQueue
import time
import random
import os
def consumer(q):
    while True:
        res=q.get()
        time.sleep(random.randint(1,3))
        print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
        q.task_done()#接收一个,它会返回一个值给生成者

def product_baozi(q):
    for i in range(5):
        time.sleep(2)
        res='包子%s' %i
        q.put(res)
        print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
    q.join()

if __name__ == '__main__':
    q=JoinableQueue()
    #生产者们:厨师们
    p1=Process(target=product_baozi,args=(q,))
    #消费者们:吃货们
    p4=Process(target=consumer,args=(q,))
    p4.daemon=True#守护进程主进程结束它也结束
    p1.start()
    p4.start()

    p1.join()#等p1运行完
    print('')

多个生成者与消费者

from multiprocessing import Process,JoinableQueue
import time
import random
import os
def consumer(q):
    while True:
        res=q.get()
        time.sleep(random.randint(1,3))
        print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
        q.task_done()

def product_baozi(q):
    for i in range(3):
        time.sleep(2)
        res='包子%s' %i
        q.put(res)
        print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
    q.join()

def product_gutou(q):
    for i in range(3):
        time.sleep(2)
        res='骨头%s' %i
        q.put(res)
        print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
    q.join()

def product_ganshui(q):
    for i in range(3):
        time.sleep(2)
        res='泔水%s' %i
        q.put(res)
        print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
    q.join()
if __name__ == '__main__':
    q=JoinableQueue()
    #生产者们:厨师们
    p1=Process(target=product_baozi,args=(q,))
    p2=Process(target=product_gutou,args=(q,))
    p3=Process(target=product_ganshui,args=(q,))

    #消费者们:吃货们
    p4=Process(target=consumer,args=(q,))
    p5=Process(target=consumer,args=(q,))
    p4.daemon=True
    p5.daemon=True

    p_l=[p1,p2,p3,p4,p5]
    for p in p_l:
        p.start()

    p1.join()
    p2.join()
    p3.join()

    print('')

 

---恢复内容结束---

posted on 2017-08-28 16:32  黎明NB  阅读(301)  评论(0编辑  收藏  举报

导航