【问题标题】:Getting results from multiprocessing.process for a loop从 multiprocessing.process 获取结果以进行循环
【发布时间】:2014-02-04 16:50:07
【问题描述】:

这个程序的目标是为循环 num 计算 loop_random。我想用 4 个并行处理器计算 4 个随机不同的 num/4,最后求和得到 u_total。但问题是,虽然我看到所有 4 个处理器都在运行,但最终结果计算为同一组 num/4 的 4 倍。但我想为 4 个不同的随机数组计算 loop_random。 这是我正在处理的部分代码的 sn-p。 .

from numpy import *
import multiprocessing as mp
from multiprocessing import Process, Queue
num = 5000
def loop_random(num, out):
    n = 1
    total = zeros(((100.,100.,100.)), dtype='float')
    while n<= num:
        x, y , z = random.rand(100), random.rand(100), random.rand(100) #some random numbers
        result = x**2 + y**2 + z**2
        total = total + result
        n += 1
    out.put(total)

if __name__=='__main__':
    q1 = mp.Queue()
    q2 = mp.Queue()
    q3 = mp.Queue()
    q4 = mp.Queue()
    p1 = mp.Process(target = loop_random, args=(num/4, q1))
    p2 = mp.Process(target = loop_random, args=(num/4, q2))
    p3 = mp.Process(target = loop_random, args=(num/4, q3))
    p4 = mp.Process(target = loop_random, args=(num/4, q4))
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    u_total_proc1 = q1.get()
    u_total_proc2 = q2.get()
    u_total_proc3 = q3.get()
    u_total_proc4 = q4.get()
    p1.join()
    p2.join()
    p3.join()
    p4.join()
    u_total = u_total_proc1 + u_total_proc2 + u_total_proc3 + u_total_proc4
    print u_total

欢迎提出任何建议。问题更多是关于这是多处理的正确方法吗?每个队列是否计算相同的结果而不存储,或者每个处理器计算不同的结果并存储?非常感谢你的帮助。如果我说的有问题,请纠正我。

【问题讨论】:

  • 如果您发布一个工作示例可能会有所帮助,有很多语法错误会阻止您的示例运行
  • 哦,对不起。由于它是程序的一部分,我没有看。我现在将编辑它。谢谢。
  • 现在它的工作:) 请检查
  • 您能否提供更多关于您预期的 u_total 的解释或原始值?根据您的描述,听起来您期望 (loop_random(x/4) * 4) = loop_random(x),这不会与 total 每次都初始化为零。
  • 谢谢。是的,我期待(loop_random(x/4) * 4) = loop_random(x)。所以你认为它正在发生是因为我将总数初始化为零?我将在循环外初始化总并尝试。

标签: python process parallel-processing multiprocessing


【解决方案1】:

很抱歉发布此答案,因为它不是答案,但是我还不能发布 cmets。

只是想注意使用:

from pylab import *

被认为是不良行为。不要一揽子导入一堆随机的东西。每个模块都应该有一个长长的列表,列出它需要的具体内容。

根据 Python Zen:

显式优于隐式。

无法反驳:)

【讨论】:

  • 现在你可以评论了,为什么不删除这个并添加评论?
  • @CharlieParker 似乎无法删除已接受的答案。
猜你喜欢
  • 2013-04-20
  • 2021-09-25
  • 1970-01-01
  • 2014-06-20
  • 2015-09-18
  • 2017-05-17
  • 1970-01-01
  • 2017-02-07
  • 2017-02-02
相关资源
最近更新 更多