gpt4 book ai didi

python - 在多处理中返回 - Python

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:51 25 4
gpt4 key购买 nike

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

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() 数据。

无耻插件:考虑用我的vimap图书馆。它可以解决许多多处理怪异问题。

关于python - 在多处理中返回 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21002755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com