首页 > 系统相关 >Python中共享内存对进程池的影响

Python中共享内存对进程池的影响

时间:2024-08-23 13:04:12浏览次数:10  
标签:__ Python self value ex 进程 共享内存 pool

在Coding过程中,发现了共享内存会对进程池产生影响。

原始程序设计的思路是,在类中使用进程池创建不同的进程,这些进程间通过共享内存的方式控制一些变量。代码如下

import ctypes
from multiprocessing import Pool, Value


class Ex:
    def __init__(self, value):
        self.value = value

    def start(self):
        pool = Pool(1)
        pool.apply_async(self.p)

        pool.close()
        pool.join()

    def p(self):
        while True:
            print("Hello")

if __name__ == '__main__':
    value = Value(ctypes.c_bool, True)
    ex = Ex(value)
    ex.start()
    
# >>> 无输出

在该段代码中,创建了一个共享内存变量value,且实例化了一个类exex调用类中的start方法通过进程池创建了一个进程,该进程执行方法p。运行后发现,程序没有任何输出,但是当注释掉ex类构造方法中的self.value = value时,程序则可以正常运行。

import ctypes
from multiprocessing import Pool, Value


class Ex:
    def __init__(self, value):
        # self.value = value
        ...

    def start(self):
        pool = Pool(1)
        pool.apply_async(self.p)

        pool.close()
        pool.join()

    def p(self):
        while True:
            print("Hello")

if __name__ == '__main__':
    value = Value(ctypes.c_bool, True)
    ex = Ex(value)
    ex.start()
    
# >>> 循环输出'Hello'

初步判断是使用上文的共享内存方法与进程池会产生冲突。在StackOverflow上有人提出手动创建进程而不使用进程池,经尝试可以解决问题。

同时本文也找到了另一种解决方案,可采用manager对象创建共享内存,manager对象创建共享内存和直接创建共享内存的区别可查阅该文。简而言之便是,Value()速度快但是仅限于一台主机,Manager().Value()速度稍慢但可以跨平台使用。将程序改造后便可以正常运行。

import ctypes
from multiprocessing import Pool, Manager


class Ex:
    def __init__(self, value):
        self.value = value

    def start(self):
        pool = Pool(1)
        pool.apply_async(self.p)

        pool.close()
        pool.join()

    def p(self):
        while True:
            print("Hello")

if __name__ == '__main__':
    # 改造了共享内存创建方式
    manager = Manager()
    value = manager.Value(ctypes.c_bool, True)
    
    ex = Ex(value)
    ex.start()
    
# >>> 正常循环输出'Hello'

标签:__,Python,self,value,ex,进程,共享内存,pool
From: https://www.cnblogs.com/ToryRegulus/p/18375781

相关文章

  • 【Python】函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量
    文章目录函数的定义函数的调用形参和实参函数的返回值一个return多个return多元赋值变量作用域函数内的变量全局变量和局部变量修改全局变量函数的定义函数的定义:分配任务def函数名(形参列表): 函数体 return返回值def:define,定义形参列表中,可以有多个形......
  • python 06-标准库:random、string、webbrowser、email模块
    random、string模块importrandomimportstringprint(random.random())#任意-个float数字print(random.randint(1,10))#1-10之间包括1和18中任意一个整数print(random.choice([1,2,3]))#1,2,3这几个数字里面任意一个print(random.choices([1,2,3],k=2))......
  • Python个人收入影响因素模型构建:回归、决策树、梯度提升、岭回归
    全文链接:https://tecdat.cn/?p=37423原文出处:拓端数据部落公众号“你的命运早在出生那一刻起便被决定了。”这样无力的话语,无数次在年轻人的脑海中回响,尤其是在那些因地域差异而面临教育资源匮乏的年轻人中更为普遍。在中国,这种现象尤为明显:没有生在大城市的他们,从小便需面对......
  • python安装paramiko报错
    腾讯云上python3.6,使用pip3.6install paramiko报错[root@VM-0-14-centostest]#pip3.6installparamikoWARNING:Runningpipinstallwithrootprivilegesisgenerallynotagoodidea.Try`pip3.6install--user`instead.CollectingparamikoDownloadinghttp://......
  • python实现token签名认证
    当你注册了一个网站,通常,网站会向你的邮箱里发一封激活邮件,邮件里会有一个url,只有当你点击这个url,才能激活你的用户身份。如何完成身份确认呢?通常,邮箱里的那个url里会有一个token,这个token是所有问题的关键,当你点击url,网站后台会受到这个请求,得到这个token,网站必须通过这个token找......
  • Python解析DB URI
    数据库配置信息一般包含数据库类型、数据库服务器地址、端口号、用户名、密码、要链接的数据库,以及一些选项等,例如通常我们需要配置多个变量来完成整个配置,如db_type='mysql'host='localhost'port=3306user='root'password='passw0rd'db='testdb'charset='u......
  • 用Python实现9大回归算法详解——09. 决策树回归算法
    1.决策树回归的基本概念决策树回归(DecisionTreeRegression)是一种树状结构的回归模型,通过对数据集进行递归分割,将数据分成更小的子集,并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈值来最大化每次分裂后的目标函数增益,从而找到使误差最小化的模型......
  • Python下载安装全流程(Python 最新版本),新手小白必看!
    第一次接触Python,可能是爬虫或者是信息AI开发的小朋友,都说Python语言简单,那么多学一些总是有好处的,下面从一个完全不懂的Python的小白来安装Python等一系列工作的记录,并且遇到的问题也会写出,让完全不懂的小白也可上手安装,并且完成第一个Helloworld代码。需要安装包......
  • python socket编辑示例 UDP
    服务端:fromsocketimportsocket,AF_INET,SOCK_DGRAMrecv_socket=socket(AF_INET,SOCK_DGRAM)recv_socket.bind(('127.0.0.1',8888))whileTrue:data,addr=recv_socket.recvfrom(1024)#接收数据print('客户说:',data.decode('......
  • Python3测试mysql插入数据代码(chatgpt生成)
      实现的功能:先连接mysql数据库,然后读取某个目录所有以txt文件命名后缀的json内容文件,解析出对应的key和value,然后插入数据到mysql数据库,最后关闭数据库连接 importosimportjsonimportpymysqlimportre"""尝试插入json文件到MySQL数据库。dbInfo:MySQL数据库......