multiprocessing.shared_memory --- 从进程直接访问的共享内存(1)

这篇具有很好参考价值的文章主要介绍了multiprocessing.shared_memory --- 从进程直接访问的共享内存(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

模块提供了一个类 SharedMemory,用于分配和管理共享内存,供多核或对称多处理器 (SMP) 机器上的一个或多个进程访问。 为了协助共享内存的生命周期管理,尤其是跨不同进程的共享内存,multiprocessing.managers 模块中还提供了一个 BaseManager 子类 SharedMemoryManager

在这个模块中,共享内存指的是“System V 风格”的共享内存块(尽管不一定如此显式地实现),而不是指“分布式共享内存”。 这种类型的共享内存允许不同的进程潜在地读取和写入易失性内存的公共(或共享)区域。

进程通常被限制为只能访问自己的进程内存空间,但共享内存允许在进程之间共享数据,从而避免需要在包含该数据的进程之间发送消息。 与通过磁盘或套接字或其他需要序列化/反序列化和复制数据的通信共享数据相比,直接通过内存共享数据可以提供显着的性能优势。

二、函数介绍

参数

def __init__(self, name=None, create=False, size=0)
  • name (str | None):请求的共享内存的唯一名称,指定为字符串。 在创建新的共享内存块时,如果该值 None(默认值),则会生成一个新名称。
  • create (bool):是创建新的共享内存块(True)还是附加现有的共享内存块(False)【即使用已用的共享内存块】。
  • size (int):指定创建新共享内存块时请求的字节数。 由于某些平台选择根据该平台的内存页大小分配内存块,因此共享内存块的确切大小可能大于或等于请求的大小。 当附加到现有共享内存块时,size 参数将被忽略。

方法

  • close():关闭该实例对共享内存的访问。为确保正确清理资源,所有实例都应当在实例不再被需要时调用 close()。 请注意调用 close() 并不会导致共享内存块本身被销毁。
  • unlink():请求销毁底层的共享内存块。为了执行必要的清理,在所有需要使用这个共享内存块的进程中 unlink() 应当被调用一次(且仅有一次)。 在发出此销毁请求后,共享内存块可能会也可能不会被立即销毁,并且此行为在不同系统平台上可能不同。在 unlink() 已被调用后再尝试访问共享内存块中的数据可能导致内存访问错误。
  • buf:共享内存块内容的 memory view 。
  • name:共享内存块的唯一标识,只读属性。
  • size:共享内存块的字节大小,只读属性。

注意:最后一个结束持有共享内存块的进程可能以任意顺序调用 unlink()close()

三、代码测试

测试代码1

# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email:  m21z50c71@163.com
# @VX:fylaicai

from multiprocessing import Process
from multiprocessing import shared_memory
import numpy as np


# 生产者进程:创建共享内存块并存储数据
def producer():
    data = np.array([1, 2, 3, 4, 5])
    shm = shared_memory.SharedMemory(name="parameter_data", create=True, size=data.nbytes)
    array = np.ndarray(data.shape, dtype=data.dtype, buffer=shm.buf)
    array[:] = data
    print(f"Producer stored data in shared memory: {array}")
    return shm


# 消费者进程:连接到共享内存块并取出数据
def consumer(name):
    shm = shared_memory.SharedMemory(name=name, create=False)
    array = np.ndarray((5,), dtype=np.int32, buffer=shm.buf)
    print(f"Consumer retrieved data from shared memory: {array * 2}")
    shm.close()


if __name__ == "__main__":
    # 生产者进程存储数据到共享内存
    shm = producer()

    # 消费者进程连接到共享内存并取出数据
    # consumer(shm.name)
    p = Process(target=consumer, args=(shm.name,))
    p.start()
    p.join()

    # 删除共享内存块
    shm.unlink()

测试代码2

发送

# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email:  m21z50c71@163.com
# @VX:fylaicai

from multiprocessing import shared_memory
import numpy as np
import time


# 生产者进程:创建共享内存块并存储数据
def producer():
    make_mem = 1
    while True:
        data = np.array([1, 2, 3, 4, 5])
        for i in range(10):
            if make_mem == 1:
                shm = shared_memory.SharedMemory(name='parameter_data', create=True, size=20)
                make_mem = 0
            else:
                shm = shared_memory.SharedMemory(name='parameter_data', create=False, size=20)
            array = np.ndarray(data.shape, dtype=data.dtype, buffer=shm.buf)
            data += 1
            array[:] = data
            print(f"{i} Producer stored data in shared memory: {array}")
            time.sleep(1)


if __name__ == "__main__":
    producer()

接收

# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email:  m21z50c71@163.com
# @VX:fylaicai


from multiprocessing import shared_memory
import numpy as np
import time


# 消费者进程:连接到共享内存块并取出数据
def consumer():
    while True:
        shm = shared_memory.SharedMemory(name='parameter_data', create=False, size=20)
        array = np.ndarray((5,), dtype=np.int32, buffer=shm.buf)
        print(f"Consumer retrieved data from shared memory: {array}")
        time.sleep(0.9)


if __name__ == "__main__":
    consumer()

四、书籍推荐

推荐一本书籍,全网第一份Pytorch函数常用手册,包括Tensors介绍、基础函数介绍、数据处理函数、优化函数、CUDA编程、多处理等十四章内容,文章中含有大量的实例来加深对函数的使用技巧。

multiprocessing sharememory,多进程,python,multiprocessing

multiprocessing sharememory,多进程,python,multiprocessing

multiprocessing sharememory,多进程,python,multiprocessing

关注下方公众号:@AI算法与电子竞赛,回复关键字 “PDF” 获取下载地址。

multiprocessing.shared_memory --- 从进程直接访问的共享内存(1)

五、链接作者

欢迎关注我的公众号:@AI算法与电子竞赛

multiprocessing sharememory,多进程,python,multiprocessing

硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!文章来源地址https://www.toymoban.com/news/detail-855328.html

到了这里,关于multiprocessing.shared_memory --- 从进程直接访问的共享内存(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 multiprocessing 多进程处理批量数据

    示例代码 multiprocessing.Pool 创建进程池, 传入的参数是要要使用的 CPU 内核数量, 直接用 cpu_count() 可以拿到当前硬件配置所有的 CPU 内核数. pool.map 可以直接将处理后的结果拼接成一个 list 对象 应用在实际数据处理代码的效果对比: 普通处理方式, 用时 221 秒 多进程处理方式, 用时

    2024年02月09日
    浏览(40)
  • Python自学:使用多进程处理 multiprocessing

    以下代码没有使用多进程。 输出为: Sleeping 1 second… Done Sleep… Sleeping 1 second… Done Sleep… Finished in 2.03 second(s) 以下代码使用了多进程。 输出为: Sleeping 1 second… Sleeping 1 second… Done Sleep… Done Sleep… Finished in 1.07 second(s) 输出为: Sleeping 1.5 second(s)… Sleeping 1.5 second(s)… Slee

    2024年02月09日
    浏览(40)
  • Python中使用multiprocessing模块创建进程

            在计算机编程领域,多进程编程是一种常见的并发编程技术,特别适用于利用多核处理器来提高程序性能和并行处理任务。Python作为一种功能强大的编程语言,提供了多种方法来实现多进程编程。其中,multiprocessing模块为我们提供了一种简单而强大的方式来创建和

    2024年02月22日
    浏览(37)
  • CUDA:矩阵转置的GPU实现(Share Memory)

    本文参加2022CUDA on Platform线上训练营学习笔记 欢迎各位 大犇 提意见 上图中将 m * n 的矩阵A通过矩阵转置变成了 n * m 的 A T ,简单来讲矩阵转置即为将原始矩阵的第一行转置为目标矩阵的第一列,以此类推, 相信基础扎实的你简单地看看CPU端的代码就能理解 定义一个名为 cpu_t

    2024年02月12日
    浏览(33)
  • Queue的多线程爬虫和multiprocessing多进程

    Queue的模块里面提供了同步的、线程安全的队列类,包括FIFO(先入后出)队列Queue、FIFO(后入先出)LifoQueue和优先队列PriorityQueue。 (在上个文件创建了爬取文件) 我们使用这个方法来获取,代码如下: 对象传入myThread中; thread = myThread(tName,workQueue)  使用一个for循环来

    2024年04月14日
    浏览(37)
  • Python分享之多进程探索 (multiprocessing包)

    在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。   进程池 进程池 (Process Pool)可以创建多个进程。这些进程就像是随时待命的士兵,准备执行任务(程序)。一个进程池中可以容纳多个待命的士兵。

    2024年02月08日
    浏览(31)
  • 【python】tkinter使用多进程打包成exe后multiprocessing无法关闭对应进程

    这是由于multiprocessing模块在Windows操作系统下使用fork方法创建子进程时会导致打包成exe后无法正常运行的问题。 可以尝试使用freeze_support函数来解决这个问题。freeze_support函数是在Windows操作系统下用于支持multiprocessing模块的函数。 下面是一个示例代码: 在代码的开头,我们导

    2024年02月11日
    浏览(41)
  • Python进程池multiprocessing.Pool八个函数对比

    Python的multiprocessing.Pool类提供了多种方法来分发任务给进程池中的工作进程。这些方法在功能和用途上有所不同,适用于不同的场景。以下是multiprocessing.Pool中八个主要函数的对比 apply() 功能:阻塞地执行一个函数,直到这个函数的执行完成。 用法:apply(func, args=(), kwds={}) 特

    2024年02月04日
    浏览(35)
  • 由浅入深走进Python异步编程【多进程】(含代码实例讲解 || multiprocessing、异步进程池、进程通信)

    从底层到第三方库,全面讲解python的异步编程。这节讲述的是python的多线程实现,纯干货,无概念,代码实例讲解。 本系列有6章左右,点击头像或者专栏查看更多内容,陆续更新,欢迎关注。 部分资料来源及参考链接: https://www.bilibili.com/video/BV1Li4y1j7RY/ 现在让我们初步进入

    2024年02月03日
    浏览(46)
  • CUDA编程模型系列六(利用shared memory和统一内存优化矩阵乘)

    CUDA编程模型系列六(利用shared memory和统一内存优化矩阵乘) 本系列教程将介绍具体的CUDA编程代码的细节 CUDA编程模型系列六(利用shared memory和统一内存优化矩阵乘)

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包