网络编程之进阶

时间:2022-12-13 17:52:07

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

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('')

 

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