【问题标题】:Returning in multiprocessing - Python在多处理中返回 - Python
【发布时间】:2014-01-08 17:41:37
【问题描述】:

我正在编写可视化代码。首先,我必须生成大量图像。所以,我想并行化这个过程。到现在为止,我有这个代码:

class ImageData(object):

    def __init__(self, width, height, range_min=-1, range_max=1):
        """
        The ImageData constructor
        """
        self.width = width
        self.height = height
        #The values range each pixel can assume
        self.range_min = range_min
        self.range_max = range_max
        self.data = []
        for i in range(width):
            self.data.append([0] * height)

    def shepard_interpolation(self, queue, seeds=10):
        """
        Perform a Shepard shepard_interpolation
        :param queue
        :param seeds
        """
        points = []
        f = []
        for s in range(seeds):
            # Generate a pixel position
            pos_x = random.randrange(self.width)
            pos_y = random.randrange(self.height)

            # Save the f(x,y) data
            x = Utils.translate_range(pos_x, 0, self.width, self.range_min, self.range_max)
            y = Utils.translate_range(pos_y, 0, self.height, self.range_min, self.range_max)
            z = Utils.function(x, y)
            points.append([x, y])
            f.append(z)

        for i in range(self.width):
            xt = (Utils.translate_range(i, 0, self.width, self.range_min, self.range_max))
            for j in range(self.height):
                yt = (Utils.translate_range(j, 0, self.height, self.range_min, self.range_max))
                self.data[i][j] = Utils.shepard_euclidian(points, f, [xt, yt], 3)
        queue.put(self)

class Utils:
    def __init__(self):
        pass

    @staticmethod
    def shepard_euclidian(x, z, p, u):
        n = len(x)
        d = [0.0] * n
        for i in range(n-1):
            pi = x[i]
            d[i] = math.pow(math.hypot(pi[0]-p[0], pi[1]-p[1]), u)
        w = [0.0] * n
        sw = 0.0
        for i in range(n-1):
            w[i] = 1.0
            for k in range(n-1):
                if i != k:
                    w[i] *= d[k]
            sw += w[i]
        for i in range(len(w)-1):
            if sw != 0.0:
                w[i] /= sw
            else:
                w[i] = 0.0
        c = 0.0
        for i in range(n):
            c += (w[i] * z[i])
        return c

if __name__ == '__main__':
    q = Queue()
    processes = [Process(target=ImageData.shepard_interpolation, args=(ImageData(50, 50), q,))    for _ in range(2)]
    for process in processes:

    process.start()
    for process in processes:
        print "Trying to join"
        process.join()
        if hasattr(os, 'getppid'):  # only available on Unix
            print process.pid, 'joining', os.getppid()
    print "Finish"

问题是因为我的某些过程永远不会结束。我发现如果我在queue.put(self) 中评论queue.put(self) 行,所有过程都会完成,但我没有收到任何回报。但是,如果我取消注释此行,我会收到打印 尝试加入,但它永远不会结束。我真的不知道是什么问题。我虽然关于尝试同时写入队列的进程,但我发现这已经由它管理。我不知道是什么问题。

任何帮助将不胜感激。 提前谢谢你。

【问题讨论】:

    标签: python queue return multiprocessing


    【解决方案1】:

    您可能已超出队列。多处理队列基于 FIFO,并具有固定的缓冲区大小。在加入进程之前,您应该尝试 queue.get() 主程序中的数据。

    无耻插件:考虑使用我的vimap 库。它可以解决很多多处理的怪异问题。

    【讨论】:

    • 是的,我昨天做了这个,它奏效了,但我不知道为什么这样做有意义。现在我知道!谢谢!
    • PS:我会看看这个库。 (:
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2014-01-25
    • 2021-10-15
    相关资源
    最近更新 更多