python多进程程序设计 之五

news2024/9/20 15:35:28

python多进程程序设计 之五

  • 进程间通信
    • Shared ctypes
      • Value
      • Array
      • 实列代码
    • sharedctypes
      • RawArray
      • RawValue
      • Array
      • Value
      • 实列代码

进程间通信

Shared ctypes

Value

词法:multiprocessing.Value(typecode_or_type, *args, lock=True)

返回从共享内存分配的 ctypes 对象。默认情况下,返回值实际上是对象的同步包装器。可以通过 Value 的 value 属性来访问对象本身。

typecode_or_type 确定返回对象的类型:它是 ctypes 类型,或数组模块使用的一个字符的类型代码。 *args被作为这个类型的构造函数传递给这个构造器。

如果 lock 为 True(默认值),则创建一个新的递归锁对象,来同步对该值的访问。如果 lock 是 Lock 或 RLock 对象,那么,它将用于同步对该值的访问。如果lock为False,那么对返回对象的访问,将不会自动受到锁的保护,因此它不一定是“进程安全的”。

Array

词法:multiprocessing.Array(typecode_or_type, size_or_initializer, *, lock=True)
返回从共享内存分配的 ctypes 数组。默认情况下,返回值实际上是数组的同步包装器。

typecode_or_type 确定返回数组元素的类型:它是 ctypes 类型或数组模块使用的单字符类型代码。如果 size_or_initializer 是一个整数,那么它决定了数组的长度,并且数组最初将被清零。否则,size_or_initializer 是一个用于初始化数组的序列,其长度决定了数组的长度。

如果 lock 为 True(默认值),则创建一个新的锁对象,来同步对该值的访问。如果 lock 是 Lock 或 RLock 对象,那么,它将用于同步对该值的访问。如果lock为False,那么,对返回对象的访问将不会自动受到锁的保护,因此它不一定是“进程安全的”。

实列代码

from ctypes import *
import multiprocessing as mp
import time

def proc_0(a1, inc):
    print("start Process {0} inc: {1}".format(mp.current_process().name, inc))
    time.sleep(0.5)
    with a1.get_lock():
        for i in range(len(a1)):
            a1[i] += inc;
            print("Process {0} a1[{1}] = {2}".format(mp.current_process().name, i, a1[i]))
            time.sleep(0.2)

def proc_1(a1, inc):
    print("start Process {0} inc: {1}".format(mp.current_process().name, inc))
    time.sleep(0.5)
    with a1.get_lock():
        for i in range(len(a1)):
            a1[i] += inc;
            print("Process {0} a1[{1}] = {2}".format(mp.current_process().name, i, a1[i]))
            time.sleep(0.1)

if __name__ == "__main__":  
    mp.freeze_support()
  
    a1 = mp.Array(c_int16, [1, 3, 4, 5])       

    p1 = mp.Process(target=proc_0, args=(a1, 4))
    p2 = mp.Process(target=proc_1, args=(a1, 7))
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()

显示器输出

start Process Process-1 inc: 4
start Process Process-2 inc: 7
Process Process-1 a1[0] = 5
Process Process-1 a1[1] = 7
Process Process-1 a1[2] = 8
Process Process-1 a1[3] = 9
Process Process-2 a1[0] = 12
Process Process-2 a1[1] = 14
Process Process-2 a1[2] = 15
Process Process-2 a1[3] = 16

sharedctypes

multiprocessing.sharedctypes 模块提供了从共享内存中分配 ctypes 对象的函数。
注意, 这些对象可以由子进程继承。

RawArray

词法:multiprocessing.sharedctypes.RawArray(typecode_or_type, size_or_initializer)

返回从共享内存分配的 ctypes 数组。

  • typecode_or_type,确定返回数组元素的类型。它是 ctypes 类型,或数组模块使用的单字符类型代码。
  • size_or_initializer, 如果 size_or_initializer 是一个整数,那么,它确定数组的长度,并且,数组最初将被清零。否则,size_or_initializer 是一个用于初始化数组的序列,其长度决定了数组的长度。

读/写RawArray元素,可能是非原子的。所以,如果数据的读/写需要同步,则需要使用同步机制。

RawValue

词法:multiprocessing.sharedctypes.RawValue(typecode_or_type, *args)

返回从共享内存分配的 ctypes 对象。

  • typecode_or_type,确定返回对象的类型。它是 ctypes 类型或数组模块使用的单字符的类型代码。
  • args,被传递给该类型的构造函数。

读/写值可能是非原子的。所以,如果数据的读/写需要同步,则需要使用同步机制,或使用 Value() ,来确保使用锁自动同步访问。

Array

词法:multiprocessing.sharedctypes.Array(typecode_or_type, size_or_initializer, *, lock=True)

与 RawArray() 相同。只是根据 lock 的值,返回进程安全的同步包装器,而不是原始 ctypes 数组。

Value

词法:multiprocessing.sharedctypes.Value(typecode_or_type, *args, lock=True)

与 RawValue() 相同,只是根据 lock 的值,返回进程安全的同步包装器,而不是原始 ctypes 对象。

实列代码

这个代码在两个进程之间共享一个结构数组,因为使用了RawArray,RawArray不包含用于进程同步的锁,所以增加一个锁变量,用来同步两个进程对数组的存取。

from ctypes import *
import multiprocessing as mp
import time
import multiprocessing.sharedctypes as sc;

class employee(Structure):
    _pack_ = 1
    _fields_ = [("year", c_int16), ("month", c_int16), ("day", c_int16)]
    
def proc_0(inc, lock, a1):
    print("start Process {0} inc: {1}".format(mp.current_process().name, inc))
    time.sleep(0.5)
    with lock:
        for i in range(len(a1)):
            a1[i].year += inc;
            print("Process {0} a1[{1}] = {2}".format(mp.current_process().name, i, a1[i].year))
            time.sleep(0.2)

def proc_1(inc, lock, a1):
    print("start Process {0} inc: {1}".format(mp.current_process().name, inc))
    time.sleep(0.5)
    with lock:
        for i in range(len(a1)):
            a1[i].year += inc;
            print("Process {0} a1[{1}] = {2}".format(mp.current_process().name, i, a1[i].year))
            time.sleep(0.1)

if __name__ == "__main__":
    mp.freeze_support()
  
    a1 = sc.RawArray(employee, 3)
    a1[0].year = 2010
    a1[1].year = 2015
    a1[2].year = 2017
    lock = mp.Lock()
    dargs = {"a1":a1, "lock":lock}
    
    p1 = mp.Process(target=proc_0, args=(4,), kwargs=dargs)
    p2 = mp.Process(target=proc_1, args=(7,), kwargs=dargs)
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()
start Process Process-1 inc: 4
start Process Process-2 inc: 7
Process Process-1 a1[0] = 2014
Process Process-1 a1[1] = 2019
Process Process-1 a1[2] = 2021
Process Process-2 a1[0] = 2021
Process Process-2 a1[1] = 2026
Process Process-2 a1[2] = 2028

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

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

相关文章

机房三大网络拓扑图,太实用了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 通常来说,机房的三大网络拓扑图指的是星型拓扑、总线型拓扑和环形拓扑。 在实际的机房网络设计中…

vue项目加载cdn失败解决方法

注释index.html文件中 找到vue.config.js文件注释、

MySQL_图形管理工具简介、下载及安装(超详细)

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

【VUE3.0】动手做一套像素风的前端UI组件库---先导篇

系列文章目录 【VUE3.0】动手做一套像素风的前端UI组件库—Button 目录 系列文章目录引言准备素材字体鼠标手势图 创建vue3项目构建项目1. 根据命令行提示选择如下:2. 进入项目根目录下载依赖并启动。3. 设置项目src路径别名,方便后期应用路径。4. 将素…

Debian 12上安装google chrome

当前系统:Debian 12.7 昨天在Debian 12.7上安装Google Chrome时,可能由于网络原因,导入公钥始终失败。 导致无法正常使用命令#apt install google-chrome-stable来安装google chrome; 解决办法: Step1.下载当前google chrome稳…

C++性能优化-代码角度

减少跳转/分支语句和函数调用 原因 分支语句:当 CPU 执行到分支语句时,将会进行分支预测(对大部分PC)。如果分支预测错误,就会清空已经预取和执行的部分指令,重新从正确的分支开始取指和执行,…

某东-h5st参数逆向分析

目标:商品搜索翻页接口 直接搜索h5st就可以搜到,所有可疑位置都打上断点,然后翻页,最终断点位置: window.PSign.sign(colorParamSign)是异步代码,colorParamSign是传入的参数,执行后把包含h5st…

基于YOLOv5的教室人数检测统计系统

基于YOLOv5的教室人数检测统计系统可以有效地用于监控教室内的学生数量,适用于多种应用场景,比如 自动考勤、安全监控或空间利用分析 以下是如何构建这样一个系统的概述,包括环境准备、数据集创建、模型训练以及如何处理不同类型的媒体输入…

【机器学习】--- 序列建模与变分自编码器(VAE)

在机器学习领域,序列建模与变分自编码器(Variational Autoencoder, VAE) 是两个至关重要的技术,它们在处理时间依赖性数据与复杂数据生成任务中都发挥着关键作用。序列建模通常用于自然语言处理、语音识别等需要保持顺序关系的任务…

【老板必看!】电脑怎么看使用软件时间记录?一文读懂5种超实用的方法!

在企业管理中,电脑虽不善言语、不会说话,但会留下无数线索,就像一场未解之谜,等待着各位福尔摩斯得到来,去揭开它的秘密面纱。 你是否曾好奇过,当你不在的时候,员工都在用电脑都在忙些什么&…

基于python+django+vue的影视推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的影…

大表数据如何在OceanBase中进行表分区管理的实践

背景 将Zabbix的数据库迁移至OceanBase后,以其中的几个大表作为案例,本文将分享如何利用ODC(OceanBase 开发者工具),来进行自动管理OB数据库中的表分区的方案。 因为原始表里已经有大量的数据,如果贸然对…

快速掌握Postman接口测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中,并例化。 优先编码器Ⅰ的代码如下: module…

BERT模型解读与简单任务实现(论文复现)

BERT模型解读与简单任务实现(论文复现) 本文所涉及所有资源均在传知代码平台可获取 概述 相关背景 语言模型:语言模型是指对于任意的词序列,它能够计算出这个序列是一句话的概率。 预训练:预训练是一种迁移学习的概念…

c++类和对象(6个默认成员函数)第二级中阶

目录 6个默认成员函数介绍 构造函数 构造函数是什么? 构造函数的6种特性 析构函数 析构函数是什么? 析构函数的特性 拷贝构造函数 什么是拷贝构造函数 拷贝函数的特性 四.默认生成的拷贝构造实行的是浅拷贝(值拷贝)&am…

【2024】前端学习笔记9-内部样式表-外部导入样式表-类选择器

学习笔记 内部样式表外部导入样式表类选择器&#xff1a;class 内部样式表 内部样式表是将 CSS 样式规则写在 HTML 文档内部。通过<style>标签在 HTML 文件的<head>部分定义样式。 简单示例&#xff1a; <!DOCTYPE html><html><head><style…

【linux】基础IO(上)

1. 共识原理 文件 内容 属性文件分为 打开的文件 没打开的文件打开的文件 &#xff1a; 是进程打开的 ----- 本质是要研究文件和进程的关系没打开的文件 &#xff1a; 没打开的文件储存在磁盘上&#xff0c;由于没打开的文件很多&#xff0c;所以需要分门别类的防止好&…

常用函数式接口的使用

FunctionalInterface注解 函数式接口在java中是指:有且仅有一个抽象方法的接口。 虽然知道怎么使用&#xff0c;但是没有搞懂使用场景&#xff0c;暂且记录下使用方法吧&#xff0c;不至于看到源码的时候不知所云。 要我自己写代码&#xff0c;我是想不起来这样用的&#xff0…

YOLOv9改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv9目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力&#xff0c;缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制&#xff0c;使空间注…