python多进程编程(模式与锁)

news2024/9/23 5:32:04

multiprocessing的三种模式

  • fork,【拷贝几乎所有资源】【支持文件对象/线程锁等传参】【unix】【任意位置开始】【快】
  • spawn,【run参数传参必备资源】【不支持文件对象/线程锁等传参】【unix、win】【main代码块开始】【慢】
  • forkserver,【run参数传必备资源】【不支持文件对象/线程锁传参】【部分unix】【main代码块开始】
import multiprocessing
multiprocessing.set_start_method('spawn')

在这里插入图片描述

官方文档https://docs.python.org/zh-cn/3/library/multiprocessing.html

进程锁

  • Lock类与RLock类相同:由于进程之间随机调度:某进程可能执行n条后,CPU接着执行其他进程。为了多个进程同时操作一个内存中的资源时不产生混乱,我们使用锁。

  • Lock类与RLock类的区别:无论是Lock还是RLock,提供的方法都非常简单,acquire和release。但是Lock和RLock的区别是什么呢?RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的锁。

def work(filename, max_count):
    for n in range(max_count):
        f = open(filename, "r")
        try:
            nbr = int(f.read())
        except ValueError as err:
            print ("File is empty, starting to count from 0, error: " + str(err))
            nbr = 0
        f = open(filename, "w")
        f.write(str(nbr + 1) + '\n')
        f.close()


if __name__ == '__main__':
    work('demo.txt', 5)

# 输出
File is empty, starting to count from 0, error: invalid literal for int() with base 10: ''

Process finished with exit code 0

工作函数被调用了 5 次,正如所期望的那样,它计数正确,没有损失任何数据。在第一次读取时,见到了一个空文件。这会为 int()抛出 invalid literal for int()的
错误(因为在一个空字符串上调用了 int())。这个错误只发生了一次,之后,我们总是会有一个合法的值用于读取并把它转变成一个整数。

def run_one_work(filename, lock):
    lock.acquire()
    f = open(filename, "r")
    try:
        nbr = int(f.read())
    except ValueError as err:
        print("File is empty, starting to count from 0, error: " + str(err))
        nbr = 0
    f = open(filename, "w")
    f.write(str(nbr + 1) + '\n')
    f.close()
    lock.release()


if __name__ == '__main__':
    multiprocessing.set_start_method("spawn")
    lock = multiprocessing.Lock()
    file_name = 'demo.txt'
    for i in range(5):
        p = multiprocessing.Process(target=run_one_work, args=(file_name,lock,))
        p.start()
        p.join()
    time.sleep(7)
# spawn模式需要特殊处理
process_list = []
for i in range(5):
    multiprocessing.Process(target=run_one_work, args=(file_name,lock,))
    p.start()
    process_list.append(p)
for p in process_list:
    p.join()

锁实例程序:

from multiprocessing import Process
from multiprocessing import Lock
import time
import json

def show_ticket(i):
    time.sleep(0.1)
    with open('ticket') as f:
        dic = json.load(f)
        print('余票: %s' %dic.get('ticket'))

def buy_ticket(i, lock):
    lock.acquire() #加锁
    with open('ticket') as f:
        dic = json.load(f)
        time.sleep(0.1)
        if dic.get('ticket') >0:
            dic['ticket'] -= 1
            print('\033[32m%s买到票了\033[0m' %i)
        else:
            print('\033[31m%s没买到票\033[0m' %i)
    time.sleep(0.1)
    with open('ticket', 'w')as f:
        json.dump(dic, f)
    lock.release() #释放锁
if __name__ == '__main__':
    for i in range(10):
        p = Process(target=show_ticket, args=(i,) )
        p.start()
    lock = Lock()
    for i in range(10):
        p1 = Process(target=buy_ticket, args=(i,lock))
        p1.start()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库提供的系统函数及添加外键约束

十八、数据库提供的系统函数 1、数值型函数 2、字符串函数 注意:使用utf8mb4或者utf8汉字都在第三个字节,是Unicode编码,所以一个汉字占3个字节 GBK编码,一个汉字两个字节 char_length()不管编码,中文英文都一个 下标…

Linux下安装RabbitMQ教程

官方安装指南:https://www.rabbitmq.com/install-rpm.html 我们将要安装的RabbitMQ的版本是3.8.2 el/7/rabbitmq-server-3.8.2-1.el7.noarch.rpm - rabbitmq/rabbitmq-server packagecloud 不需要单独安装Erlang环境。 2. 环境配置: 前提&#xff…

吃透《西瓜书》第三章 线性模型

🍉 吃瓜系列 教材:《机器学习》 周志华著 🕒时间:2023/7/25 📓 参考:周志华《机器学习》西瓜书啃书指导 📓 参考:第3章-一元线性回归 前言 什么是回归? 回归&#xff1…

echart折线图,调节折线点和y轴的间距(亲测可用)

options代码: options {tooltip: {trigger: axis, //坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。},xAxis: {type: category,//类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。…

申请开通【商家转账到零钱】超时后如何反馈?

前言 在微信开放社区看到很人【商家转账到零钱】超过了7-15个工作日没有回复,还在审核中,遇到这个问题怎么解决呢?我最近正好在申请,这篇文章我就要讲讲我是如何找到客服,并且得到反馈的。 步骤 1.关注【腾讯客服】公…

VBA技术资料MF34:检查Excel自动筛选是否打开

【分享成果,随喜正能量】聪明人,抬人不抬杠;傻子,抬杠不抬人。聪明人,把别人抬得很高,别人高兴、舒服了,看你顺眼了,自然就愿意帮你!而傻人呢?不分青红皂白&a…

nsq整体架构及各个部件作用详解

文章目录 前言 nsq的整体架构图 部件:nsqd 部件:nsqlookupd 部件:nsq连接库 部件:nsqadmin 前言 上两篇博客 centos环境搭建nsq单点_YZF_Kevin的博客-CSDN博客 linux环境搭建nsq集群_YZF_Kevin的博客-CSDN博客 我们讲了nsq是…

【Qt】QML-01:使用QtCreator10创建QML工程,并讲解第一个程序:Hello World

1、创建QML工程 1)新建工程 打开QtCreator10,依次点击“Create Project” --> “Application(Qt)” --> “Qt Quick Application(compat)” 注意:本人打算使用Qt5.15.2创建工程,而非Qt6,因此选择兼容低于Qt6版本的“Qt Quick Applicat…

深度学习入门教程(2):使用预训练模型来文字生成图片TextToImageGenerationWithNetwork

本深度学习入门教程是在polyu HPCStudio 启发以及资源支持下进行的,在此也感谢polyu以及提供支持的老师。 本文内容:在GoogleColab平台上使用预训练模型来文字生成图片Text To Image Generation With Network (1)你会学到什么&a…

TEE GP(Global Platform)技术委员会及中国任务小组

TEE之GP(Global Platform)认证汇总 一、TEE GP技术委员会 二、GP中国任务小组 参考: GlobalPlatform Certification - GlobalPlatform

QT: 用定时器完成闹钟的实现

闹钟项目&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QDebug> #include <QTextToSpeech> #include <QMessageBox> #include <QTimer>QT_BEGIN…

十三章:使用图像级监督学习像素级语义关联性的弱监督语义分割

0.摘要 分割标签的不足是野外语义分割的主要障碍之一。为了缓解这个问题&#xff0c;我们提出了一个新颖的框架&#xff0c;根据图像级别的类别标签生成图像的分割标签。在这种弱监督的设置下&#xff0c;已知训练模型更倾向于分割局部有区别的部分&#xff0c;而不是整个物体区…

springMVC--数据验证以及国际化

文章目录 springMVC--数据验证以及国际化概述JSR 303 验证框架Hibernate Validator 扩展注解 应用实例需求说明代码实现引入验证和国际化相关的jar 包修改Monster.java修改MonsterHandler.java测试效果配置国际化文件springDispatcherServlet-servlet.xml创建国际化文件springm…

.NET 8 Preview 5推出!

作者&#xff1a;Jiachen Jiang 排版&#xff1a;Alan Wang 我们很高兴与您分享 .NET 8 Preview 5 中的所有新功能和改进&#xff01;此版本是 Preview 4 版本的后续版本。在每月发布的版本中&#xff0c;您将看到更多新功能。.NET 6 和 7 用户可以密切关注此版本&#xff0c;而…

数据服务:保障数据安全、提升数据价值的利器

04-08把元数据以及在它基础上的五大应用场景&#xff1a;数据发现&#xff08;数据地图&#xff09;、指标管理、模型设计、数据质量、成本优化&#xff0c;全部讲完。这部分内容对应的就是数据中台OneData 方法论。学完这部分内容&#xff0c;你已了解OneData方法论在企业内部…

ctfshow-web3

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 这个题目一看就知道是一个文件包含漏洞 php://input可以访问请求的原始数据的只读流&#xff0c;将post请求的数据当作php代码执行。 GET http://3afc5257-7b7d-4917-a1eb-5ea59fc35d8c.challenge.ctf.show/…

Numpy 数据文件

Numpy 数据文件 Numpy 数据处理函数 loadtxt np.loadtxt()函数常用的传入参数 dtype&#xff1a;所需的返回数组的数据类型。默认为floatcomments&#xff1a;用于标识注释行的字符。默认为#delimiter&#xff1a;指定分隔符字符或字符串。默认为任何空格字符skiprows&#x…

Qt : day3

1.完成简易闹钟 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTextToSpeech> //播报类 #include <QTimer> //定时器类 #include <QTime> //时间类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcla…

clickhouse分布式查询降级为本地查询

在基于 clickhouse 做类数仓建模时通常的做法是在本地创建物化视图&#xff0c;然后使用分布式表做代理对外提供服务。我们知道 clickhouse 对于 DQL 内部实现了分布式&#xff0c;而对于 DDL 则需要我们自动实现比如&#xff1a; drop table table_name on cluster cluster_n…

【6】toLocaleString、toLocaleDateString、toLocaleTimeString等toLocale系列方法的使用及案例

一、介绍 在当今前端开发的领域里&#xff0c;快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具&#xff0c;Vite 在开发中的启动速度和热重载…