Python-多处理错误“无法启动进程两次”

2024-09-28 22:08:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用Python中的multiprocessing包开发一个算法,我从internet上学习了一些教程,并尝试用这个包开发一个算法。环顾四周,使用ProcessQueuePool尝试“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

Tags: intxtformainsimprfilenameprocess
2条回答

已解决)这是我的问题的答案,很抱歉迟发了帖子。

for j in range(k-1):
    p = Process(target=prk.sim, args=(int(j * d), int((j+1) * d) + 5 - 1,))
    processes.append(p)
    p.start()

p = Process(target=prk.sim, args=(int(d * (k-1)), txtlen,))                     
processes.append(p)
p.start()   

如果k = 3我需要3个处理我的应用程序的进程。对于第一个循环,我运行流程两次,所以每次迭代我都启动流程。所以,我删除了这个代码

for pr in processes:
    pr.start()

for pr in processes:
    pr.join()

谢谢你的回复。

您之所以得到断言,是因为您多次对单个Process对象调用start。您的示例中的第二个缩进错误是process.append,我假设该行根本不应该存在。请注意,启动进程的for循环位于上层for循环中,因此它会为您创建的每个进程执行。例如,在循环的第二次中,创建第二个进程,然后再次尝试启动第一个进程。只需将开始代码移出上层for循环。

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

for pr in processes:
    pr.start()

for pr in processes:
    pr.join()

while not R.empty():
    print (R.get())

相关问题 更多 >