嗨,我正在图像处理

我正在使用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对象腌制。如果失败,您只需返回其他内容(FalseNone)或在函数本身内引发异常。

pebble池更强大,它可以为您透明地处理该问题。

10-05 23:17