python_并发编程——锁

Posted 手可摘星辰。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python_并发编程——锁相关的知识,希望对你有一定的参考价值。

多进程模拟买票~

import time
import json
from multiprocessing import Process

class Show(Process):    #
    def run(self):
        with open(\'ticket\') as f:
            dic = json.load(f)
            print("余票:{}".format(dic[\'ticket\']))

class Buy_ticket(Process):  #
    def __init__(self,name):
        super().__init__()
        self.name = name
    def run(self):
        with open(\'ticket\') as f:
            dic = json.load(f)
            time.sleep(0.1) #模拟网络延迟
        if dic[\'ticket\'] > 0:
            dic[\'ticket\'] -=1
            print(\'{}买到票了~~~\'.format(self.name))
            time.sleep(0.1) #模拟网络延迟
            with open(\'ticket\',\'w\') as f:
                json.dump(dic,f)
        else:
            print(\'{}没买到票!!!\'.format(self.name))
if __name__ == \'__main__\':
    for i in range(10):
        q1 = Show()
        q1.start()
    for i in range(10):
        i = str(i)
        q2 = Buy_ticket(i)
        q2.start()

json文件:结果:余票为1却有两个人买到票了~。

加上锁之后

import time
import json
from multiprocessing import Process
from multiprocessing import Lock

class Show(Process):    #
    def run(self):
        with open(\'ticket\') as f:
            dic = json.load(f)
            print("余票:{}".format(dic[\'ticket\']))

class Buy_ticket(Process):  #
    def __init__(self,name,lock):   #接收锁对象
        super().__init__()
        self.name = name
        self.lock = lock
    def run(self):
        self.lock.acquire()     #拿钥匙进门
        with open(\'ticket\') as f:
            dic = json.load(f)
            time.sleep(0.1) #模拟网络延迟
        if dic[\'ticket\'] > 0:
            dic[\'ticket\'] -=1
            print(\'{}买到票了~~~\'.format(self.name))
            time.sleep(0.1) #模拟网络延迟
            with open(\'ticket\',\'w\') as f:
                json.dump(dic,f)
        else:
            print(\'{}没买到票!!!\'.format(self.name))
        self.lock.release()     #还钥匙
if __name__ == \'__main__\':
    for i in range(10):
        q1 = Show()
        q1.start()
    lock = Lock()   #实例化一个锁对象
    for i in range(10):
        i = str(i)
        q2 = Buy_ticket(i,lock) #将锁对象传入子进程
        q2.start()

json文件:结果:就只有三个人买到了~~

信息量:实现限定进程(大于1)数量访问代码。

import time
import random
from multiprocessing import Process
from multiprocessing import Semaphore

class Ktv(Process):
    def __init__(self,name,sem):
        super().__init__()
        self.name = name
        self.sem = sem

    def run(self):
        self.sem.acquire()      #获取钥匙
        print(\'{}走进了KTV\'.format(self.name))
        time.sleep(random.randint(10,20))  #随机暂停10-20秒
        print(\'{}走出了KTV\'.format(self.name))
        self.sem.release()    #还钥匙

if __name__ == \'__main__\':
    sem = Semaphore(4)  #实例化,实例化的同时设置信息量
    for i in range(20):
        name = str(i)   #将信息量的对象传递进子进程
        q = Ktv(name,sem)
        q.start()

结果:开始进去4个后,只能出了一个再进去一个。

以上是关于python_并发编程——锁的主要内容,如果未能解决你的问题,请参考以下文章

python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)

python并发编程基础之守护进程队列锁

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

并发编程__Lock 同步锁

Python语言之并发编程

Python并发编程-线程