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 台机器上测试过了:
- 在 docker 容器内 运行
python:3.8.5
运行 Ubuntu 20 主机上。
- 在 docker 容器内 运行
python:3.8.5
运行 在 Windows 10 主机上使用 Docker 桌面。
- 直接在另一台Windows10台机器上运行
python 3.8.5
.
在 1 和 2 上,上述问题一直存在。 3日,任务成功完成。
我将其更改为使用 ThreadPoolExecutor
,但问题并未解决,这让我不得不说这里的核心数量无关紧要。如果我删除 concurrent.futures
用法并使用串行循环,它会完美运行。
这是 concurrent.futures
的错误吗?
进一步补充我之前的评论。我注意到 pebble
也引起了类似的问题。我切换到futureproof
,问题已经解决。
我写的代码是为了做一些数据分析工作,目前已经运行了好几个月了。但是我的源数据的大小最近显着增加,我看到代码现在在大约相同的执行点挂起而没有错误(但并不总是在同一点)。
代码如下所示:
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 台机器上测试过了:
- 在 docker 容器内 运行
python:3.8.5
运行 Ubuntu 20 主机上。 - 在 docker 容器内 运行
python:3.8.5
运行 在 Windows 10 主机上使用 Docker 桌面。 - 直接在另一台Windows10台机器上运行
python 3.8.5
.
在 1 和 2 上,上述问题一直存在。 3日,任务成功完成。
我将其更改为使用 ThreadPoolExecutor
,但问题并未解决,这让我不得不说这里的核心数量无关紧要。如果我删除 concurrent.futures
用法并使用串行循环,它会完美运行。
这是 concurrent.futures
的错误吗?
进一步补充我之前的评论。我注意到 pebble
也引起了类似的问题。我切换到futureproof
,问题已经解决。