【发布时间】: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