我在这里碰到了一堵墙,所以我会尽力解释这个问题。
def playGames(jobQueue, ...):
....
nextJob = jobQueue.get()
...
def runPool(fens, timesetting, ...):
...
for fen in fens:
jobQueue.put(Job(gamefen=fen, timecontrol=timesetting))
...
if __name__ == '__main__':
Job = collections.namedtuple('Job', 'gamefen timecontrol')
...
...
playGames(jobQueue, ...) # jobQueue is a multiprocess.Queue() object
运行此命令后,将抛出以下错误。
"'module' object has no attribute 'Job'"
所以我将Job = collections ...行移到了if name == main thing之上,并且它有效!
但是,在没有Job = collections ...移动的情况下编写代码的方式在我的Ubuntu系统上运行得非常好。
所以Windows7使用python2.7.8它不起作用 使用python2.7.6的Ubuntu14确实有效 使用python3.4.3的Ubuntu14确实有效
我必须在这里遗漏一些东西......
完全跟踪在这里:
Traceback (most recent call last):
File "c:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "c:\Python27\lib\multiprocessing\process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "c:\Users\Andy\Desktop\Github\LucasZinc\Zinc.py", line 338, in play_games
_job = jobQueue.get()
File "c:\Python27\lib\multiprocessing\queues.py", line 117, in get
res = self._recv()
AttributeError: 'module' object has no attribute 'Job'
答案 0 :(得分:1)
在Windows上,多处理的实现对代码施加了额外的约束 - 实际上会发生的事情是为每个进程启动不同的python解释器,然后这些新的解释器将python代码加载为非主要 - 因此,要使用Job,非主进程需要在if __name__=='__main__'
条件语句之外定义Job。见https://docs.python.org/2/library/multiprocessing.html下面的标题16.6.3.2