首页 > 自动化运维 > python > 进程间通讯 (三)—进程锁的使用
2015
11-19

进程间通讯 (三)—进程锁的使用

什么是进程锁呢。比如说是12306抢票系统,当剩下一张票的时候,假如同时有10个人去抢这张票,此时只有有一个人能抢到,其他人访问都是无票。为什么是显示无票呢,因为这张票已经是锁定状态了。下面我们看一下如何实现锁的功能

我们要实现这样的效果,都是按照顺序去执行的

1.png

下面我们分析一下代码

#coding=utf8
import os
from multiprocessing import Queue,Process,Lock
import time
Qmsg = Queue()

lock = Lock()

def Children_func(name):
#启动锁
        lock.acquire()
        Qmsg.put('hello_' + str(name) + '_msg_' + '_1:pid=' + str(os.getpid()))
#模拟等待时间
        time.sleep(1)
        Qmsg.put('hello_' + str(name) + '_msg_' + '_2:pid=' + str(os.getpid()))
#释放锁
        lock.release()

listp = []
#启动多进程将队列中的数据存放到listp列表中用于回收子进程,如果不使用listp也可以,那就是使用init进程回收
for i in range(10):
        p = Process(target=Children_func, args=(i,))
        p.start()
        listp.append(p)
#启动一个死循环,从队列中读取数据
while True:
        msg = Qmsg.get()
        print msg
#回收子进程
for i in range(10):
        listp[i].join()

下面我们看一下锁的执行过程,在脚本中添加了print锁之前之后的信息

#coding=utf8
import os
from multiprocessing import Queue,Process,Lock
import time
Qmsg = Queue()

lock = Lock()

def Children_func(name):


        print "\033[31m Child=%d  锁之前 \033[0m" % name
#启动锁
        lock.acquire()
        print "\033[32m Child=%d  锁定中 \033[0m" % name
        Qmsg.put('hello_' + str(name) + '_msg_' + '_1:pid=' + str(os.getpid()))
#模拟等待时间
        time.sleep(1)
        Qmsg.put('hello_' + str(name) + '_msg_' + '_2:pid=' + str(os.getpid()))
#释放锁
        lock.release()
        print "\033[33m Child=%d 释放锁 \033[0m" % name

listp = []
#启动多进程将队列中的数据存放到listp列表中用于回收子进程,如果不使用listp也可以,那就是使用init进程回收
for i in range(5):
        p = Process(target=Children_func, args=(i,))
        p.start()
        listp.append(p)
#启动一个死循环,从队列中读取数据
while True:
        msg = Qmsg.get()
        print msg
#回收子进程
for i in range(5):
        listp[i].join()

执行结果

1.png

由上面我们可以看出锁的工作顺序,是锁定一条释放一条,由于是并发执行,所以不是按照顺序打印出来的




最后编辑:
作者:tshare365
这个作者貌似有点懒,什么都没有留下。
捐 赠您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击

留下一个回复