【问题标题】:multiprocessing in python: AttributeErrorpython中的多处理:AttributeError
【发布时间】:2017-11-29 02:40:26
【问题描述】:

我正在尝试使用多处理,但我不断收到此错误:

AttributeError: Can't get attribute 'processLine' on <module '__main__' 

(processLine函数返回word,所以我猜问题出在这里,但我不知道如何解决)

import multiprocessing as mp

pool = mp.Pool(4)
jobs = []
Types =[]

def processLine(line):
     line = line.split()
     word = line[0].strip()
     return word

with open("1.txt", "r", encoding = "utf-8") as f:
     for line in f:
          word = (jobs.append(pool.apply_async(processLine,(line))))
          Types.append(word)
     filtered_words=[]
     with open("2.txt", "r", encoding = "utf-8") as f:
          for line in f:
               word = jobs.append(pool.apply_async(processLine,(line)))
               if word in Types:
                    filtered_words = "".join(line)
     print(filtered_words)

for job in jobs:
    job.get()

pool.close()

这就是我得到的: 进程 ForkPoolWorker-1:

进程 ForkPoolWorker-2:

进程 ForkPoolWorker-3:

进程 ForkPoolWorker-4:

Traceback(最近一次调用最后一次):

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”,第 249 行,在 _bootstrap 中

self.run()

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”,第 93 行,运行中

self._target(*self._args, **self._kwargs)

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/pool.py”,第 108 行,在 worker 中

task = get()

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/queues.py”,第 345 行,在 get return _ForkingPickler.loads(res)

AttributeError: Can't get attribute 'processLine' on

Traceback(最近一次调用最后一次):

Traceback(最近一次调用最后一次):

Traceback(最近一次调用最后一次):

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”,第 249 行,在 _bootstrap 自我运行() 文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”, 第 249 行,在 _bootstrap 中

self.run()

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”,第 93 行,运行中

self._target(*self._args, **self._kwargs)

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”,第 93 行,运行中

self._target(*self._args, **self._kwargs)

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/pool.py”,第 108 行,在 worker 中

task = get()

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/pool.py”,第 108 行,在 worker 中 任务 = 获取() 文件“/Users/user/anaconda/lib/python3.6/multiprocessing/queues.py”,第 345 行,在 get 返回 _ForkingPickler.loads(res) _bootstrap 中的文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”,第 249 行 自我运行() 文件“/Users/user/anaconda/lib/python3.6/multiprocessing/queues.py”,第 345 行,在 get 返回 _ForkingPickler.loads(res) 文件“/Users/user/anaconda/lib/python3.6/multiprocessing/process.py”,第 93 行,运行中 self._target(*self._args, **self._kwargs) AttributeError:无法获取属性“processLine” AttributeError:无法获取属性“processLine” 文件“/Users/user/anaconda/lib/python3.6/multiprocessing/pool.py”,第 108 行,在 worker 中 任务 = 获取()

文件“/Users/user/anaconda/lib/python3.6/multiprocessing/queues.py”, 第 345 行,在获取中

return _ForkingPickler.loads(res)

AttributeError: Can't get attribute 'processLine' on

【问题讨论】:

  • 如果(line) 需要是一个元组,请执行(line,)。逗号组成一个元组,而不是括号。
  • 不,行不必是元组。
  • 哪个实际行会引发错误?你能发布完整的堆栈跟踪吗?
  • 另外,我无法通过在 Py3.6.2 解释器中运行它来重现您的错误...
  • 您在哪个平台(Linux?Windows?)上运行?

标签: python python-3.x multiprocessing python-multiprocessing


【解决方案1】:

multiprocessing 模块需要能够安全地导入您的模块。任何不在函数或类中的代码都应该受到标准 Python 导入防护的保护:

if __name__ == '__main__':
    ...code goes here...

但是您的代码还有其他问题。例如,您有:

word = jobs.append(pool.apply_async(processLine,(line)))

...但是append 不返回值,所以这将始终将None 分配给word

与其使用for 循环重复调用pool.apply_async,不如考虑使用pool.map_async,或者如果您实际上不需要异步行为,则只使用pool.map

【讨论】:

  • 这能解释 OP 的问题吗?
  • 不是吗?我的意思是,显然我认为它确实如此,否则我不会费心把它贴在这里。我怀疑文件中未受保护的代码导致了错误,但由于它不是mcve,我实际上无法尝试自己运行它,而不需要更多地处理代码。
  • 我不知道,是否能够通过输入输入正常运行代码。没有收到 OP 的错误或需要保护块。
【解决方案2】:

我通过在管理员模式下使用 VS Code 来运行它而不是 Anaconda Spyder 来解决 AttributeError 问题。

【讨论】:

    猜你喜欢
    • 2019-02-14
    • 2020-07-18
    • 2014-11-16
    • 2014-02-01
    • 1970-01-01
    • 2020-09-22
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多