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