Python课程设计 第 37 / 52 篇

进程并发

Chapter22

任务名称 - 进程并发

任务简介

  1. 理解进程的本质并学会使用文章中讲到的Linux命令
  2. 理解并发的工作原理
  3. 学会开启进程的两种方式
  4. 理解守护进程互斥锁的应用
  5. 理解IPC机制的条件和通讯方式
  6. 能够熟练使用生产者消费者模型

社群话题

Python怎么实现进程间的通信的

详细说明

进程是计算机最小的资源单位

打卡要求

  1. 写一个模拟100个用户抢10张火车票的程序,要求如下:
1 100个用户一定是并发查看票数余量,购票当然也是并发执行的
2 用户在购票时模拟网络延迟,可能查票的时候有票,但是购票的时候就没有了
3 进程之间的通信使用硬盘来完成
4 不能出现数据错误,比如多个用户买同一张票,购票成功却票数没减
5 不需要写用户的登录注册
import json
import time
import random
import os
from multiprocessing import Process, Lock

mutex = Lock()

# 互斥锁vs join的区别二:
# 互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行

def search():
    time.sleep(random.randint(1, 3))
    with open('db.json', 'r', encoding='utf-8') as f:
        dic = json.load(f)
        print('%s 剩余票数:%s' % (os.getpid(), dic['count']))

def get():
    with open('db.json', 'r', encoding='utf-8') as f:
        dic = json.load(f)
    if dic['count'] > 0:
        dic['count'] -= 1
        time.sleep(random.randint(1, 3))
        with open('db.json', 'w', encoding='utf-8') as f:
            json.dump(dic, f)
        print('%s 购票成功' % os.getpid())

def task(lock):
    search()
    lock.acquire()
    get()
    lock.release()

if __name__ == '__main__':
    for i in range(10):
        p = Process(target=task, args=(mutex,))
        p.start()
  1. 基于网络通信写一个用户注册的程序,要求如下:
1 用户在客户端注册时,服务器会给用户的客户端发送一个随机验证码,用户使用它校验。
2 多个用户并发执行注册功能时服务端使用消息队列来处理用户请求

作业打卡截至时间:9.29日