【问题标题】:python multiprocessing not working at allpython多处理根本不起作用
【发布时间】:2013-02-20 14:14:25
【问题描述】:

所以我拿了下面的代码,运行它,但实际上什么也没发生。 Python 表现得好像它已经完成了一切(也许它已经完成了),但没有打印出来。任何帮助使它工作将不胜感激!

import multiprocessing

def worker(number):
    print number
    return

if __name__ == '__main__':
    test = multiprocessing.Process(target=worker, args=[0,1,2,3,4])
    test.start()

【问题讨论】:

    标签: python python-2.7 multiprocessing


    【解决方案1】:

    您的代码实际上应该会导致错误。 multiprocessing.Process()args 参数不会为每个参数打开一个进程,它只是将列表中的参数提供给单个函数,然后在子进程中调用该函数。要像这样运行 5 个单独的实例,您必须执行以下操作:

    import multiprocessing
    
    def worker(number):
        print number
        return
    
    if __name__ == '__main__':
        procs = []
    
        for i in range(5):
            procs.append(multiprocessing.Process(target=worker, args=[i]))
    
        [proc.start() for proc in procs]
    

    【讨论】:

    • 好的,我刚刚尝试了该代码,它也刚刚返回,没有打印任何内容。不知道为什么。
    • 您使用的是什么操作系统?您如何运行程序(IDLE、python 命令后跟包含源代码的文件的名称等)?我在 Ubuntu 12.04 上使用 Python 2.7.3 运行了该代码,它按预期打印了数字。
    • IDLE 有问题。正如stackoverflow.com/a/2774623/407861 答案的最后一条评论所说,“好吧,IDLE 是一件奇怪的事情。为了‘捕获’你使用 print 语句或 sys.stdout.write 编写的所有内容,IDLE “覆盖” sys.stdout 和用一个将所有内容都传递回 IDLE 的对象替换它,以便它可以打印它。我猜当你从多处理启动一个新进程时,这个hackery 不会被子进程继承,因此你在 IDLE 中看不到任何东西“
    • @andsoa 如果您通过交互式解释器运行代码,您也会遇到同样的问题。
    【解决方案2】:

    您的代码尝试在新进程中运行 worker(0,1,2,3,4)。如果要在多个进程中并行执行worker()函数:

    from multiprocessing import Pool
    
    def worker(number):
        return number*number
    
    if __name__ == '__main__':
        pool = Pool() # use all available CPUs
        for square in pool.imap(worker, [0,1,2,3,4]):
            print(square)
    

    【讨论】:

      【解决方案3】:

      当我运行您的代码时,它会导致错误。由于 args 使用逗号进行解析,因此您需要指定整个数组由单个参数组成。

      import multiprocessing
      
      def worker(number):
          print number
          return
      
      if __name__ == '__main__':
          test = multiprocessing.Process(target=worker, args=([0,1,2,3,4],))
          test.start()
          test.join()
      

      另外,别忘了在最后加入这个过程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 2020-12-26
        • 1970-01-01
        相关资源
        最近更新 更多