【发布时间】:2014-12-09 18:19:04
【问题描述】:
我尝试使用 Python 中的 multiprocessing 包开发算法,我从互联网上学习了一些教程并尝试使用此包开发算法。在环顾四周并使用Process、Queue 和Pool 尝试我的“hello world”后,我尝试在此代码上实现队列
def main(queue):
d = ...
k = ...
filename, patname, txt, pat = ...
R = queue
processes = []
for j in range(k-1):
processes.append(Process(target=sim, args=(int(j * d), int((j+1) * d), txt, pat, filename, patname, R, )))
# processes.append(Process(target=sim, args=(int(j * d), len(txt), txt, pat, filename, patname, R, )))
for pr in processes:
pr.start()
for pr in processes:
pr.join()
while not R.empty():
print (R.get())
if __name__ == '__main__':
R = Queue()
main(R)
但是,出现如下错误:
AssertionError: Cannot start a process twice
有人可以帮忙解决这个问题吗
完整输出:
sim(e_original.txt, e_modify0%.txt) = 0.000000
sim(e_original.txt, e_modify0%.txt) = 0.000000
1
Traceback (most recent call last):
File "measure.py", line 108, in <module>
main()
File "measure.py", line 98, in main
pr.start()
File "C:\Python27\lib\multiprocessing\process.py", line 120, in start
assert self._popen is None, 'cannot start a process twice'
AssertionError: cannot start a process twice
sim(e_original.txt, e_modify0%.txt) = 0.000000
【问题讨论】:
-
哪个操作系统?在 Windows 上,多处理调用必须由
if __name__=='__main__':保护,以防止无限进程创建。 -
Windows 8.1,我已经在我的代码中声明了它。唯一的问题是我在上面显示的 AssertionError,我可以就错误先生获得更多建议吗? @tdelaney
-
在 2.7 和 3.2+ 分支中修复了 windows 问题。
-
您能否附上与我的问题相关的问题修复文档的链接? @Ethan Furman
-
@EthanFurman - 3.4 multiprocessing doc 仍然包含警告:确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程) . 过时了吗?