python - ConcurrentFutures ThreadPoolExecuter 未完成 pd.DataFrame.append
问题描述
在使用 python ThreadPoolExecutor 并通过执行一些网络请求遍历列表时,我遇到了一个问题,即我的工作人员在任务被标记为完成之前没有完成。
如果您使用 for 循环和 ThreadPoolExecutor 执行相同的任务,我的 DataFrame 的长度会随着 ThreadPoolExecutor 的不同而不同。For 循环始终执行所有任务。
是否有问题,或者有什么需要添加到 ThreadPoolExecutor 才能正常工作?
import pandas as pd
import time
import concurrent.futures
columns = ['name']
data = pd.DataFrame(columns = columns)
persons = ['Tom', 'Mike', 'Susan', 'David', 'Ellen']
def update(person):
global data
time.sleep(0.2)
data = data.append(pd.DataFrame({'name': person}, index=[person]))
for x in persons:
update(x)
print(len(data))
data = pd.DataFrame(columns = columns)
with concurrent.futures.ThreadPoolExecutor() as executor:
executor.map(update, persons)
print(len(data))
解决方案
从文档中:
从 pandas 0.11 开始,pandas 不是 100% 线程安全的。已知问题与 copy() 方法有关。如果您正在对线程之间共享的 DataFrame 对象进行大量复制,我们建议您在发生数据复制的线程内持有锁。
推荐阅读
- tensorflow - Tensorflow Hub 与 Keras 应用程序 - 性能下降
- r - 计算 R 矩阵中每列特定整数的数量
- python-3.x - 通知设备应用程序进行设备孪生更新(python)
- javascript - 反应:改变状态 onMouseOver
- vba - 从查询中提取多个电子邮件地址以自动访问电子邮件?
- python - 用 LightGBM 制作 CART / RF 的超参数
- python - Django - Receiving error "too many values to unpack (expected 2)"
- javascript - 如何在可重用的 NPM 包中导出多个 React 组件,以便它们可以独立导入并从应用程序包中排除依赖项?
- java - 如何获得在小米(MIUI)设备中删除联系人的权限?
- excel - 目录中不存在文件时的 VBA 错误处理