首页 > 技术文章 > 互斥锁

zero17 2022-03-04 21:01 原文

"""Tickdata >>>> {"num": 1}"""
# -*- encoding: utf-8 -*-
from multiprocessing import Process, Lock
import time
import random
import json

# 查库
def search(iname):
    with open("Tickdata", 'r', encoding='utf-8') as f:
        num = json.load(f)
        num = num.get('num')
        if num:
            print(f'{iname} find {num}')
        else:
            print(f'{iname} not find')

# 更新库
def buy(iname):
    with open('Tickdata', 'r', encoding='utf-8') as f:
        dic = json.load(f)
    
    # time.sleep()模拟延迟
    time.sleep(random.randint(1, 3))
    if dic.get('num') > 0:
        dic['num'] -= 1
        with open('Tickdata', 'w', encoding='utf-8') as f:
            json.dump(dic, f)
        print(f'{iname} is buyed')
    else:
        print(f'{iname} not buyed')


def run(iname, mutex):
    search(iname)
    # 抢锁
    mutex.acquire()
    buy(iname)
    # 释放锁
    mutex.release()


if __name__ == '__main__':
    # 加锁
    mutex = Lock()
    for i in range(1, 10):
        p = Process(target=run, args=(i, mutex))
        p.start()

 

推荐阅读