Python 的 concurrent.futures 在某些系统的多线程和多处理中挂起

Python's concurrent.futures hangs in both multithreading and multiprocessing on some systems

我写的代码是为了做一些数据分析工作,目前已经运行了好几个月了。但是我的源数据的大小最近显着增加,我看到代码现在在大约相同的执行点挂起而没有错误(但并不总是在同一点)。

代码如下所示:

def submission_loop(data, submission):
    # No loops in this function
    # Do some data analysis

    return result

def data_loop(arg1, arg2, data_row):
    # Check this marker against all the criteria
    results = []
    for data in data_row:
        for submission in submissions:
            results.append(submission_loop(data, submission))
            
    # Do something with result here
    return results

if __name__ == '__main__':
    with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count()) as executor:
        chunksize = max(1, int(len(data_rows)/cpu_count()))
        results = executor.map(functools.partial(data_loop, *args), data_rows, chunksize=chunksize)
        results = list(results)     

注意循环的三个级别。

现在,我已经在 3 台机器上测试过了:

  1. 在 docker 容器内 运行 python:3.8.5 运行 Ubuntu 20 主机上。
  2. 在 docker 容器内 运行 python:3.8.5 运行 在 Windows 10 主机上使用 Docker 桌面。
  3. 直接在另一台Windows10台机器上运行python 3.8.5.

在 1 和 2 上,上述问题一直存在。 3日,任务成功完成。

我将其更改为使用 ThreadPoolExecutor,但问题并未解决,这让我不得不说这里的核心数量无关紧要。如果我删除 concurrent.futures 用法并使用串行循环,它会完美运行。

这是 concurrent.futures 的错误吗?

进一步补充我之前的评论。我注意到 pebble 也引起了类似的问题。我切换到futureproof,问题已经解决。