一、 进程锁(Lock):

  1.1 定义:

1. 同一时刻同一段代码,只能有一个进程来执行这段代码
2. 锁的应用场景,当多个进程需要操作同一个文件/数据库的时候 ,
3. 会产生数据不安全,我们应该使用锁来避免多个进程同时修改一个文件

  1.2 示例:

  
# 示例:
import json
import time
from multiprocessing import Process, Lock

# 查询余票
def search_ticket(name):
    with open('ticket', encoding='utf-8') as f:
        dic = json.load(f)
        print('%s查询余票为%s' % (name, dic['count']))

# 购买车票
def buy_ticket(name):
    with open('ticket', encoding='utf-8') as f:
        dic = json.load(f)
    time.sleep(2)
    if dic['count'] >= 1:
        print('%s买到票了' % name)
        dic['count'] -= 1
        time.sleep(2)
        with open('ticket', mode='w', encoding='utf-8') as f:
            json.dump(dic, f)
    else:
        print('余票为0,%s没买到票' % name)


# 使用线程锁方式一:
def use1(name, lock):
    search_ticket(name)
    print('%s在等待' % name)
    lock.acquire()
    print('%s开始执行了' % name)
    buy_ticket(name)
    lock.release()


# 使用线程锁方式二:
def use2(name, lock):
    """
    # with lock:
    #     代码块
    # 上下文管理:在__enter__方法中获取锁(acquire),在__exit__方法中释放锁(release)
    """
    search_ticket(name)
    print('%s在等待' % name)
    with lock:
        print('%s开始执行了' % name)
        buy_ticket(name)


if __name__ == '__main__':
    lock = Lock()
    l = ['alex', 'wusir', 'baoyuan', 'taibai']
    for name in l:
        Process(target=use1, args=(name, lock)).start()  # 方式一
        Process(target=use2, args=(name, lock)).start()  # 方式二
View Code

相关文章: