首页 > 解决方案 > 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))

标签: pythonfor-looppython-requestsiterationthreadpool

解决方案


从文档中:

从 pandas 0.11 开始,pandas 不是 100% 线程安全的。已知问题与 copy() 方法有关。如果您正在对线程之间共享的 DataFrame 对象进行大量复制,我们建议您在发生数据复制的线程内持有锁。


推荐阅读