在多处理中返回-Python

在多处理中返回-Python,python,queue,return,multiprocessing,Python,Queue,Return,Multiprocessing,我正在编写一个可视化代码。首先,我必须生成大量的图像。所以,我想把这个过程并行化。到目前为止,我有以下代码: class ImageData(object): def __init__(self, width, height, range_min=-1, range_max=1): """ The ImageData constructor """ self.width = width self.heigh

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

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)
,所有过程都会完成,但我没有收到任何返回。但是如果我取消了这一行的注释,我会收到试图加入的打印,但它永远不会结束。我真的不知道是什么问题。我考虑过进程同时尝试在队列中写入,但我发现这已经由它管理了。我不知道问题出在哪里

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

你的队伍可能已经排满了。多处理队列基于FIFO,具有固定的缓冲区大小。在加入进程之前,应该尝试将主例程中的数据queue.get()排入队列


无耻插头:考虑使用我的库。它解决了很多复杂的多处理问题。

是的,我昨天做了这个,它成功了,但我不知道为什么这样做有意义。现在我知道了!非常感谢。附:我来看看这个图书馆。(: