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

news/2025/3/6 2:43:10/

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 = 0f = 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 = 0f = 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 jsondef 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'] -= 1print('\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.ppmy.cn/news/983457.html

相关文章

【C++进阶之路】适配器、反向迭代器、仿函数

文章目录 前言一、适配器①模拟实现栈②模拟实现对列 二、反向迭代器三、仿函数总结 前言 我们先来笼统的介绍一下今天的三个内容。 适配器——简单的理解就是复用,用已经实现的轮子,来继续实现某种功能。 反向迭代器——原理很简单,就是对…

PHP在线相册--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库项目目录如图:代码部分:主页 配套资源作业: 本系列校训 用免费公开视频,卷飞培训班哈人&…

VUE之axios使用,跨域问题,拦截器添加Token

参考资料: 参考视频 视频资料及个人demo Axios中文文档 VUE之基本部署及VScode常用插件 VUE之基本组成和使用 VUE之Bootstrap和Element-UI的使用 准备工作: 关于SpringBoot和SpringCloud的搭建,以及mybatis-plus的整合见本人之前的CSDN博客,下面编写get请求和post请求…

在vue项目中使用postcss-px2rem插件把px转变为rem,并配合给html根元素设置fontsize,来实现页面的自适应效果

在vue项目中使用postcss-px2rem插件把px转变为rem,并配合给html根元素设置fontsize,来实现页面的自适应效果 安装postcss-px2rem插件,目的:把px转变为remvue.config.js中配置remUnit通过js改变html的fontsize值postcss-px2rem插件…

在Android中使用新版proguard混淆器的方式

文章目录 一、Proguard混淆器二、新版混淆器使用方式(插件版)三、R8与proguard四、参考链接 一、Proguard混淆器 Proguard是Android开发时经常会用到的一个混淆工具,在Android SDK中已经集成了一个免费的Proguard版本,位于/tools/proguard目录中。对于A…

tauri在github上进行自动更新打包并发版过程,实战操作避坑

从网上找了很多很多的文章,结果还是入坑了,一个问题找了一天才解决: Error A public key has been found, but no private key. Make sure to set TAURI_PRIVATE_KEY environment variable. 596 ELIFECYCLE  Command failed with exit code…

【React学习】React父子组件通讯

1. 父到子传值 在React框架中,父组件可以通过 props 将数据传递给子组件。子组件通过读取 props 来访问父组件传递过来的数据。 当父组件的 props 发生变化时,React 会自动重新渲染子组件以确保子组件中使用的数据保持同步。 父组件 import React, {…

transformer 笔记

目录 目前在NLP领域当中,主要存在三种特征处理器——CNN、RNN 以及 Transformer,当前Transformer的流行程度已经大过CNN和RNN,它抛弃了传统CNN和RNN神经网络,整个网络结构完全由Attention机制以及前馈神经网络组成。 Transformer…