在多处理中返回-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()排入队列