我尝试使用多处理,但我不断收到此错误:
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;在
答案 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问题。