互斥锁 IPC 生产者消费者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了互斥锁 IPC 生产者消费者相关的知识,希望对你有一定的参考价值。

 

import json
import time
import random
import os
from multiprocessing import Process,Lock

mutex=Lock()
# 互斥锁vs join的区别一:
# 互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行


def search():
    time.sleep(random.randint(1,3))
    with open(\'db.json\',\'r\',encoding=\'utf-8\') as f:
        dic=json.load(f)
        print(\'%s 剩余票数:%s\' %(os.getpid(),dic[\'count\']))

def get():
    with open(\'db.json\',\'r\',encoding=\'utf-8\') as f:
        dic=json.load(f)
    if dic[\'count\'] > 0:
        dic[\'count\']-=1
        time.sleep(random.randint(1,3))
        with open(\'db.json\',\'w\',encoding=\'utf-8\') as f:
            json.dump(dic,f)
        print(\'%s 购票成功\' %os.getpid())

def task(lock):
    search()
    lock.acquire()
    get()
    lock.release()

if __name__ == \'__main__\':
    for i in range(10):
        p=Process(target=task,args=(mutex,))
        p.start()

 

互斥锁得自己加锁  锁是一个危险的事  不然成死锁
所以IPC 机制里的Queue就是帮我们自动处理锁的事
用Queue
队列(推荐使用)
创建队列的类
    Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,
    可以使用Queue实现多进程之间的数据传递。
参数介绍:
      maxsize是队列中允许最大项数,省略则无大小限制。
1.队列:队列类似于一条管道,元素先进先出
需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态
2.队列分类
队列有很多种,但都依赖与模块queue
q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
  
q.get_nowait():同q.get(False)
q.put_nowait():同q.put(False)
 
q.empty():调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。
q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
q.qsize():返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样

来自 <http://www.cnblogs.com/haiyan123/p/7429568.html> 

 

以上是关于互斥锁 IPC 生产者消费者的主要内容,如果未能解决你的问题,请参考以下文章

20181229(守护进程,互斥锁,IPC,生产者和消费者模型)

守护进程互斥锁ipc机制生产者消费者模型

守护进程,互斥锁,IPC,生产者与消费者模型

守护进程,互斥锁,IPC,队列,生产者与消费者模型

python—day29 守护进程互斥锁模拟抢票IPC通信机制生产者消费者模型

Python学习第20篇:互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型