使用多处理模块

2024-01-27

我正在尝试使用 python 2.6 中的多处理模块,但显然有一些我不明白的东西。我希望下面的类将通过 add() 发送给它的数字相加,并在 get_result() 方法中返回总和。下面的代码打印“0”,我希望它打印“2”。我错过了什么?

import multiprocessing

class AdderProcess(multiprocessing.Process):

    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.sum = 0
        self.queue = multiprocessing.JoinableQueue(5)
        self.daemon = True
        self.start()

    def run(self):
        while True:
            number = self.queue.get()
            self.sum += number
            self.queue.task_done()

    def add(self, number):
        self.queue.put(number)

    def get_result(self):
        self.queue.join()
        return self.sum


p = AdderProcess()
p.add(1)
p.add(1)
print p.get_result()

附言。这个问题已经解决了。感谢您的回答!为了让任何读者更容易,这里是完整的工作版本:

import multiprocessing

class AdderProcess(multiprocessing.Process):

    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.sum = multiprocessing.Value('d', 0.0)
        self.queue = multiprocessing.JoinableQueue(5)
        self.daemon = True
        self.start()

    def run(self):
        while True:
            number = self.queue.get()
            self.sum.value += number
            self.queue.task_done()

    def add(self, number):
        self.queue.put(number)

    def get_result(self):
        self.queue.join()
        return self.sum.value

p = AdderProcess()
p.add(1)
p.add(1)
print p.get_result()

Change self.sum = 0 to self.sum = multiprocessing.Value('d', 0.0),并使用self.sum.value访问或更改值。

class AdderProcess(multiprocessing.Process):    
    def __init__(self):
        ...
        self.sum = multiprocessing.Value('d', 0.0) 
        ...
    def run(self):
        while True:
            number = self.queue.get()
            self.sum.value += number    # <-- use self.sum.value
            self.queue.task_done()
    def get_result(self):
        self.queue.join()
        return self.sum.value           # <-- use self.sum.value

问题是这样的:一旦你打电话self.start() in __init__,主进程派生出一个子进程。所有值均被复制。现在有两个版本p。在主流程中,p.sum为 0。在子进程中,run方法被调用并且p.sum增至2。但是当主进程调用时p.get_result(),其版本为p仍然有p.sum等于 0。 所以打印0。

当想要在进程之间共享浮点值时,需要使用共享机制,例如mp.Value.

See "在进程之间共享状态 http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes” 了解有关如何分享价值观的更多选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用多处理模块 的相关文章

随机推荐

  • WPF 窗口中的透明 PNG

    我尝试将具有透明度的 PNG 图像应用到整个窗口 但窗口始终是白色的 有什么线索可以看到 PNG 的透明度吗 谢谢你 C public SplashScreen InitializeComponent var myBrush new Ima
  • 如果默认值不存在则后备背景图像

    我想将图像设置为背景 但图像名称可能是bg png or bg jpg 如果默认背景不存在 是否有任何非 javascript 方法可以创建替代图像的后备 body background url bg png background size
  • C# Json 将任何动态对象转换为键值对

    我正在编写一个工具 它将获取入站 Json 对象 并将其转换为 键值记录 有时可能称为扁平化 目的是避免工具在获取非常大或非常嵌套的 Json 对象时崩溃 因此我想避免递归 一个示例对象可能像这样 如下 包含嵌套数组 空值 你能想到的任何合
  • 在wxPHP中更新属性时如何刷新wxAuiManager窗格?

    我设置了一个简单的wxAuiManager系统包含八个文本控件 每个控件都设置为一个窗格 全部围绕一个中央静态控件排列 我有两个分别捕捉到顶部 左侧 右侧和底部窗格方向 这部分工作正常 我现在想修改每个窗格的属性 我认为可以通过重置关联的来
  • 使用 Fetch API 递归返回分页输出

    Summary 我想使用 JavaScript 的 Fetch API 递归地将分页输出整理到数组中 从 Promise 开始 我认为 async await 函数会更合适 Attempt 这是我的方法 global fetch requi
  • 为什么 Windows 上的 strftime() 返回 false? (我没有使用%e)

    这是我的代码 var dump strftime m d Y l M S time echo br var dump strftime Y d m H M S time 第一行返回 false 第三行返回预期的字符串 2012 10 09
  • 计算 NYSE 交易日的函数

    希望有人可以提供一个给定日期的函数 它将返回纽约证券交易所当月的交易日 如果考虑到假期 那就是额外的好处 如果没有 我也不太担心 提前致谢 我的个人包中有一个函数 名为TradingDates使用假期的 日历从timeDate http c
  • 需要帮助修复近似 pi 的算法

    我正在尝试为近似的算法编写 C 代码pi 它应该得到一个立方体的体积和该立方体内部球体的体积 球体的半径是立方体边长的 1 2 然后我应该将立方体的体积除以球体的体积并乘以 6 以获得 pi 它正在工作 但它在应该获得卷的部分做了一些奇怪的
  • IPython 在打印时忽略对象的 __repr__

    我写了一个子类defaultdict 我给了它自己的 repr 方法以便在交互式会话中自定义其外观 在常规 Python 会话中 这会按预期工作 Python 3 5 0 default Sep 20 2015 11 28 25 GCC 5
  • 在 C# 中,如何像 google calc 一样实现模数?

    我有一个代表形状的类 Shape 类有一个名为 Angle 的属性 我希望此属性的设置器自动将值包装到范围 0 359 中 不幸的是 一个简单的 Angle value 360 仅适用于正数 在 C 中 40 360 40 谷歌计算器可以做
  • 如何使用 FileHelpers 库将大型 SQL Server 表导出到 CSV 文件?

    我希望使用 C 和 FileHelpers 库将大型 SQL Server 表导出到 CSV 文件中 我也可以考虑 C 和 bcp 但我认为 FileHelpers 会比 bcp 更灵活 速度不是特殊要求 OutOfMemoryExcept
  • 开发和测试环境的不同 DateTimeFormat

    在我的 ASP NET MVC 项目中的 global asax cs 的 Application BeginRequest 方法中有代码 Thread CurrentThread CurrentCulture CultureInfo Cr
  • 调用带有太多参数的函数时的 GCC 行为

    我刚刚注意到 GCC 的一个行为对我来说似乎很奇怪 没有与其他编译器进行检查 如果我编译这段代码 include
  • sparql 精确匹配正则表达式

    我使用以下 sparql 查询从 dbpedia 中提取与特定信息框匹配的页面 PREFIX dbo
  • 共享会话与默认配置的会话

    两者有什么区别session以这两种不同方式创建的对象 NSURLSession session NSURLSession sharedSession and NSURLSessionConfiguration configuration
  • 返回后更新导航抽屉的选定状态

    后按后处理导航抽屉的选定状态的正确方法是什么 我有一个带有 n 个条目的导航抽屉 在列表视图中 就像 Android Studio 中的 SDK 示例一样 当我单击导航抽屉条目时 我希望将它们添加到后堆栈中 以便我可以返回到它们 在 onN
  • 如何更改 Vaadin 中的默认 HTML 模板

    我正在使用 Vaadin 和 Maven 应用程序 我想要的是更改默认的 html 模板 当我运行该应用程序时 生成的 HTML 如下所示
  • 我需要帮助为 SpeechSynthesizer 创建词典。某种模板,这样我就可以知道如何创建一个

    或多或少就是标题所说的 我希望创建一个希腊语文本到语音的词典 这样我就可以为 SpeechSynthesizer 创建我的语言 我在哪里可以找到某种模板 或者一些指导 或者您可以提供的任何内容都是可以接受的 因为 SpeechSynthes
  • Iron Python:Iron Python 有什么好处 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 python 很感兴趣 但我在 NET 环境中工作 所以我正在研究 Iron Python 并想知道它的用途 你能在里面写一个应
  • 使用多处理模块

    我正在尝试使用 python 2 6 中的多处理模块 但显然有一些我不明白的东西 我希望下面的类将通过 add 发送给它的数字相加 并在 get result 方法中返回总和 下面的代码打印 0 我希望它打印 2 我错过了什么 import