在尝试使用Python 3.6进行并行处理时,出现了“AttributeError:模块'concurrent'没有属性'futures'”的错误。

13

我正在尝试使用concurrent.futures模块将需要很长时间的进程拆分为多个进程。以下是代码。

主要函数:

with concurrent.futures.ProcessPoolExecutor() as executor:
for idx, score in zip([idx for idx in range(dataframe.shape[0])],executor.map(get_max_fuzzy_score,[dataframe[idx:idx+1] for idx in range(dataframe.shape[0])])):
    print('processing '+str(idx+1)+' of '+str(dataframe.shape[0]+1))
    dataframe['max_row_score'].iloc[idx] = score

get_max_fuzzy_score 函数:

def get_max_fuzzy_score(picklepath_or_list, df):
import numpy as np
extracted_text_columns = list(df.filter(regex='extracted_text').columns)
data_list = [df[data].iloc[0] for data in extracted_text_columns if not df[data].isnull().values.any()]
try:
    size = len(picklepath_or_list)
    section_snippet_list = picklepath_or_list
except:
    section_snippet_list = pickle.load(open(picklepath_or_list,'rb'))
scores = []
for section_snippet in section_snippet_list:
    for data in data_list:
        scores.append(fuzz.partial_ratio(data,section_snippet))
score = max(scores)

return score
该函数接受几列的值,并从先前构建的列表中返回最大模糊匹配度分数。 这是我收到的错误信息:
Traceback (most recent call last):
  File "multiprocessing.py", line 8, in <module>
    import concurrent.futures
  File "/home/naveen/anaconda3/lib/python3.6/concurrent/futures/__init__.py", line 17, in <module>
    from concurrent.futures.process import ProcessPoolExecutor
  File "/home/naveen/anaconda3/lib/python3.6/concurrent/futures/process.py", line 53, in <module>
    import multiprocessing
  File "/home/naveen/Documents/pramata-ie/data-science/scripts/multiprocessing.py", line 79, in <module>
    with concurrent.futures.ProcessPoolExecutor() as executor:
AttributeError: module 'concurrent' has no attribute 'futures'
2个回答

22

您可以这样导入:

import concurrent.futures

并且可以这样使用:

executor = concurrent.futures.ThreadPoolExecutor(max_workers=num_workers)

你也可以用以下方式导入 ThreadPoolExecutor

from concurrent.futures.thread import ThreadPoolExecutor

并且这样使用:

executor = ThreadPoolExecutor(max_workers=num_workers)

3
谢谢,这很有帮助(已点赞)。但我不明白为什么会发生这种情况?如果futures是一个子模块,那么我们应该可以通过“.”符号访问它。 - Himanshu Patel

2

不要将你的 python 文件命名为 threading.py 或 multiprocessing.py。


2
你的回答可以通过提供更多支持性信息来改进。请编辑以添加更多细节,例如引用或文档,以便其他人可以确认您的答案是否正确。您可以在帮助中心中找到有关撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接