嗨,我正在图像处理
我正在使用ProcessPoolExecutor
来加快图像数据处理的速度,直到看起来似乎没有斑点的图像为止,它都可以正常工作(但是我不确定这是否是真正的问题,我做了很多小时的谷歌搜索。)
引起了...
TypeError
...并永远陷入僵局。
该代码在没有ProcessPoolExecutor的情况下可以正常工作,因此我认为我的代码没有问题,但ProcessPoolExecutor没有问题。
所以我的问题是,“有什么方法可以避免ProcessPoolExecutor陷入死锁状态吗?”
我的代码如下:
def image_resize(filename):
image_size = 50
img = Image.open(filename)
img = img.convert("RGB")
img = img.resize((image_size, image_size))
return img
def main():
for idx, cat in enumerate(categories):
image_dir = root_dir + "/" + cat
files = glob.glob(image_dir + "/01" + "/*.jpg")
with concurrent.futures.ProcessPoolExecutor() as executor:
for f, img in zip(files, executor.map(image_resize, files, timeout=3, chunksize=1)):
data = np.asarray(img)
X.append(data)
Y.append(idx)
if __name__ == '__main__':
main()
X = np.array(X)
Y = np.array(Y)
X_train, X_test, y_train, y_test = train_test_split(X, Y)
xy = (X_train, X_test, y_train, y_test)
np.save("./food3.npy", xy)
print("ok,", len(Y))
错误信息 :
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Programs\Python\Python35\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Programs\Python\Python35\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "C:\Programs\Python\Python35\lib\concurrent\futures\process.py", line 273, in _queue_management_worker
result_item = reader.recv()
File "C:\Programs\Python\Python35\lib\multiprocessing\connection.py", line 251, in recv
return ForkingPickler.loads(buf.getbuffer())
TypeError: __new__() missing 2 required positional arguments: 'lang' and 'tkey'
最佳答案
您可能受此枕头bug的影响。
我暂时看到的唯一解决方法是尝试在返回img
之前使image_resize
对象腌制。如果失败,您只需返回其他内容(False
,None
)或在函数本身内引发异常。
pebble池更强大,它可以为您透明地处理该问题。