python中的多处理:AttributeError

时间:2017-11-29 02:40:27

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

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

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

(processLine函数返回单词,所以我猜问题就在这里,但我不知道如何绕过它)

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()

这就是我得到的: Process ForkPoolWorker-1:

处理ForkPoolWorker-2:

处理ForkPoolWorker-3:

处理ForkPoolWorker-4:

追踪(最近一次呼叫最后一次):

File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py" ;,第249行,在_bootstrap

self.run()

File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py" ;,第93行,在运行中

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

文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/pool.py",第108行,在工作人员

task = get()

File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/queues.py" ;,第345行,获取     return _ForkingPickler.loads(res)

属性错误:无法获取属性&#39; processLine&#39;在

追踪(最近一次呼叫最后一次):

追踪(最近一次呼叫最后一次):

追踪(最近一次呼叫最后一次):

File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py" ;,第249行,在_bootstrap中     self.run()   File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py", 第249行,在_bootstrap

self.run()

File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py" ;,第93行,在运行中

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

File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py" ;,第93行,在运行中

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

文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/pool.py",第108行,在工作人员

task = get()

文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/pool.py" ;,第108行,在工人中     task = get()   文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/queues.py" ;,第345行,获取     return _ForkingPickler.loads(res)   文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py" ;,第249行,在_bootstrap中     self.run()   文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/queues.py" ;,第345行,获取     return _ForkingPickler.loads(res)   文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/process.py" ;,第93行,运行中     self._target(* self._args,** self._kwargs) AttributeError:无法获取属性&#39; processLine&#39;上 AttributeError:无法获取属性&#39; processLine&#39;上   文件&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/pool.py" ;,第108行,在工人中     task = get()

File&#34; /Users/user/anaconda/lib/python3.6/multiprocessing/queues.py", 第345行,在获取

return _ForkingPickler.loads(res)

属性错误:无法获取属性&#39; processLine&#39;在

2 个答案:

答案 0 :(得分:2)

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,如果您实际上没有需要异步行为。

答案 1 :(得分:0)

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