Python multiprocessing Lock和Process买票实例

原因: 加锁降低了程序的效率,让原来能够同时执行的代码变成顺序执行了,异步变同步的过程

# coding=utf-8
import json
import logging
import multiprocessing
import time

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s  %(message)s"
)


def search ():
    with open("ticket.json") as f:
        dic = json.load(f)
        return dic['count']


def get_ticket (lock, person):
    with lock:
        with open("ticket.json") as f:
            dic = json.load(f)
            logging.info(f"{person}查询余票:{dic['count']}")
            time.sleep(0.2)  # 模拟网络延迟
            if dic['count'] > 0:
                dic['count'] -= 1  # 买到票,数量减1
                time.sleep(0.2)  # 模拟网络延迟
                with open('ticket.json', 'w') as f:
                    json.dump(dic, f)  # 把剩余票数写回文件
                logging.info(f'{person}买到票了')
            else:
                logging.info(f'{person}没买到票')


def main (ctx):
    logging.info('\033[31m--------------售票开始...\033[0m')
    lock = ctx.Lock()
    ps = [ctx.Process(target=get_ticket, args=(lock, "person-%s" % i)) for i in range(1, 16)]
    [p.start() for p in ps]
    [p.join() for p in ps]
    logging.info('\033[31m--------------售票结束...\033[0m')


if __name__ == '__main__':
    # windows 启动方式
    multiprocessing.set_start_method('spawn')
    # 获取上下文
    ctx = multiprocessing.get_context('spawn')
    # 检查这是否是冻结的可执行文件中的伪分支进程。
    ctx.freeze_support()
    main(ctx)

输出:

2019-10-06 19:22:33,371  --------------售票开始...
2019-10-06 19:22:33,787  person-6查询余票:10
2019-10-06 19:22:34,202  person-6买到票了
2019-10-06 19:22:34,203  person-4查询余票:9
2019-10-06 19:22:34,613  person-4买到票了
2019-10-06 19:22:34,614  person-13查询余票:8
2019-10-06 19:22:35,017  person-13买到票了
2019-10-06 19:22:35,018  person-8查询余票:7
2019-10-06 19:22:35,419  person-8买到票了
2019-10-06 19:22:35,421  person-12查询余票:6
2019-10-06 19:22:35,826  person-12买到票了
2019-10-06 19:22:35,827  person-1查询余票:5
2019-10-06 19:22:36,229  person-1买到票了
2019-10-06 19:22:36,231  person-11查询余票:4
2019-10-06 19:22:36,632  person-11买到票了
2019-10-06 19:22:36,632  person-7查询余票:3
2019-10-06 19:22:37,034  person-7买到票了
2019-10-06 19:22:37,035  person-10查询余票:2
2019-10-06 19:22:37,438  person-10买到票了
2019-10-06 19:22:37,439  person-2查询余票:1
2019-10-06 19:22:37,841  person-2买到票了
2019-10-06 19:22:37,842  person-9查询余票:0
2019-10-06 19:22:38,043  person-9没买到票
2019-10-06 19:22:38,043  person-5查询余票:0
2019-10-06 19:22:38,244  person-5没买到票
2019-10-06 19:22:38,244  person-3查询余票:0
2019-10-06 19:22:38,445  person-3没买到票
2019-10-06 19:22:38,447  person-15查询余票:0
2019-10-06 19:22:38,647  person-15没买到票
2019-10-06 19:22:38,647  person-14查询余票:0
2019-10-06 19:22:38,848  person-14没买到票
2019-10-06 19:22:38,872  --------------售票结束...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值