首页 > 系统相关 >多进程multiprocessing

多进程multiprocessing

时间:2022-09-29 16:22:09浏览次数:412  
标签:__ name self dic print json 进程 multiprocessing

多进程实现简易版的抢票工具

实现:多个进程共享同一文件,把文件当数据库,用多个进程模拟多个人执行抢票任务
关键词:多进程,锁
1) 多进程

import json
import os
import time
from multiprocessing import Process, Lock, set_start_method

FILE_PATH = os.path.join(os.getcwd(), 'data.json')


class BuyTickets:
    def search(self, name):
        with open(FILE_PATH, 'r') as f:
            dic = json.loads(f.read())
            time.sleep(1)
            print(f"{name}用户查看剩余余票数为:{dic['count']}")

    def get(self, name):
        with open(FILE_PATH, 'r') as f_read:
            dic = json.loads(f_read.read())
            if dic.get('count') > 0:
                dic['count'] -= 1
                time.sleep(1)
                with open(FILE_PATH, 'w') as f_write:
                    json.dump(dic, f_write)
                    print(f'{name}购票成功!')
                    print(f'剩余票数为:{dic["count"]}')
            else:
                print('没票了')

    def task(self, name, lock):
        self.search(name)
        with lock:
            self.get(name)


if __name__ == '__main__':
    set_start_method('fork')
    _buy = BuyTickets()
    mutex = Lock()
    for i in range(10):
        p = Process(target=_buy.task, args=("路人%s" % i, mutex))
        p.start()

  1. 进程池
from multiprocessing import Pool,Manager

class BuyTickets:
    def search(self, name):
        with open(FILE_PATH, 'r') as f:
            dic = json.loads(f.read())
            time.sleep(1)
            print(f"{name}用户查看剩余余票数为:{dic['count']}")

    def get(self, name):
        with open(FILE_PATH, 'r') as f_read:
            dic = json.loads(f_read.read())
            if dic.get('count') > 0:
                dic['count'] -= 1
                time.sleep(1)
                with open(FILE_PATH, 'w') as f_write:
                    json.dump(dic, f_write)
                    print(f'{name}购票成功!')
                    print(f'剩余票数为:{dic["count"]}')
            else:
                print('没票了')

    def task(self, name, lock):
        self.search(name)
        with lock:
            self.get(name)


if __name__ == '__main__':
    p = Pool(5)
    set_start_method('forkserver', force=True)
    _buy = BuyTickets()
    mutex = Manager().Lock()
    for i in range(10):
        res = p.apply_async(_buy.task, args=("路人%s" % i, mutex))
    p.close()
    p.join()

标签:__,name,self,dic,print,json,进程,multiprocessing
From: https://www.cnblogs.com/hikk/p/16741991.html

相关文章

  • Openwrt进程间通信-Ubus
    Openwrt进程间通信-Ubus来源 http://www.ctfiot.com/49535.html参考 https://openwrt.org/zh/docs/techref/ubus 01 介绍 Ubus是Openwrt中的进程间通信机制,它让......
  • Linux系统编程——进程间通信:消息队列
    概述消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下:1)消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息......
  • Linux系统编程——进程间通信:管道(pipe)
    管道的概述管道也叫无名管道,它是是UNIX系统IPC(进程间通信)的最古老形式,所有的UNIX系统都支持这种通信机制。无名管道有如下特点:1、半双工,数据在同一时刻只能在一个方向......
  • 轨道交通数字化进程如何从 WHY 到 HOW
    「今天与未来之间的摆渡人,场景与技术之间的连接器」 “人悦其行,物优其流”是人们对于未来交通最理想状态的描述。人或者物,要在民航、地铁、海运、公路等各种有形的路网......
  • Linux 进程调度浅析
    概述操作系统要实现多进程,进程调度必不可少。有人说,进程调度是操作系统中最为重要的一个部分。我觉得这种说法说得太绝对了一点,就像很多人动辄就说“某某函数比某某函数效率......
  • 搜索"xxxx"的进程,同时杀进程
    一、搜索"xxxx"的进程,同时杀进程,命令如下:ps-ef|grepxxxx|grep-v'grep'|awk'{print$2}'|xargskill-9命令解释:1.ps:-a显示所有进程;......
  • [ Linux ] 进程优先级 和 环境变量
    在上篇文章我们了解了进程的状态及Linux系统的进程状态,本篇我们主要了解进程优先级及环境变量。1.进程优先级说到优先级,我们首先要清楚什么是优先级,和权限有什么关系呢?优先......
  • ams启动组件时创建新进程的流程
    ams启动组件时创建新进程的流程activity~broadcast~service~provider->ProcessList.java->startProcessLocked("android.app.ActivityThread")AppZygote.getProcess().star......
  • python的进程池,线程池的使用
    进程池importmultiprocessingimporttime#多进程编程defget_html(n):time.sleep(n)print('subprogresssuccess')returnnif__name__=='__main__':......
  • 操作系统如何让进程受限执行
    操作系统的一个任务是虚拟化CPU,让每个进程以为自己在独占CPU。现代操作系统采用分时的方式来完成这个工作,一个进程获得CPU,运行一段时间,另一个进程再获得CPU去运行,这些进程......