【问题标题】:Python - Multiprocessing Error 'cannot start a process twice'Python - 多处理错误“无法启动一个进程两次”
【发布时间】:2014-12-09 18:19:04
【问题描述】:

我尝试使用 Python 中的 multiprocessing 包开发算法,我从互联网上学习了一些教程并尝试使用此包开发算法。在环顾四周并使用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

【问题讨论】:

  • 哪个操作系统?在 Windows 上,多处理调用必须由 if __name__=='__main__': 保护,以防止无限进程创建。
  • Windows 8.1,我已经在我的代码中声明了它。唯一的问题是我在上面显示的 AssertionError,我可以就错误先生获得更多建议吗? @tdelaney
  • 在 2.7 和 3.2+ 分支中修复了 windows 问题。
  • 您能否附上与我的问题相关的问题修复文档的链接? @Ethan Furman
  • @EthanFurman - 3.4 multiprocessing doc 仍然包含警告:确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程) . 过时了吗?

标签: python multiprocessing


【解决方案1】:

您得到断言是因为您多次在单个 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())

【讨论】:

  • 错误还是一样,先生。请看一下我的问题更新,我也添加了完整的输出。对错误@tdelaney 感到困惑
  • 您的回答实际上帮助解决了我的问题,我两次启动了相同的过程,谢谢
【解决方案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()

感谢您的所有回复。

【讨论】:

    【解决方案3】:
    • 每个进程都应该在每次调用中启动和终止。

    示例代码:

    from multiprocessing import Process, Queue
    cola = Queue()
    
    if __name__ == "__main__":
    
        while True:
            msgIn = input("Cual es el mensaje: ")
    
            if "$" in msgIn:
                print("si es un dolar")
                cola.put_nowait(msgIn) 
                
            if "#" in msgIn:
                print ("tamaño conla ", cola.qsize())
                break
        
        for n in range( cola.qsize()):
            proceso = Process(args=(cola,))
            proceso.start()
            print(cola.get( timeout=2))
        
            proceso.join()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多