【问题标题】:importing target functions | multiprocessing导入目标函数 |多处理
【发布时间】:2012-02-20 15:50:06
【问题描述】:

我想学习 python 中的多处理。我开始阅读http://www.doughellmann.com/PyMOTW/multiprocessing/basics.html,但我无法理解有关导入目标函数的部分。

特别是下面这句话是什么意思..

“将应用程序的主要部分包装在检查 __main__ 中可确保在导入模块时它不会在每个子模块中递归运行。”

有人可以用一个例子更详细地解释一下吗?

【问题讨论】:

    标签: python multiprocessing main


    【解决方案1】:

    在 Windows 上,multiprocessing 模块在生成新进程时会导入 __main__ 模块。如果生成新进程的代码没有包装在if __name__ == '__main__' 块中,那么导入主模块将再次生成一个新进程。以此类推,无穷无尽。

    在题为"Safe importing of main module". 的部分的多处理文档中也提到了这个问题,您会发现以下简单示例:

    在 Windows 上运行:

    from multiprocessing import Process
    
    def foo():
        print 'hello'
    
    p = Process(target=foo)
    p.start()
    

    导致RuntimeError

    解决方法是使用:

    if __name__ == '__main__':    
        p = Process(target=foo)
        p.start()
    

    【讨论】:

      【解决方案2】:

      确保正在运行的脚本处于交互性的“顶级环境”中。

      例如,如果您想与用户交互(启动过程),您需要确保它是 ma​​in

      if __name__ == '__main__':
          do_something()
      

      【讨论】:

        【解决方案3】:
        """This is my module (mymodule.py)"""
        
        def sum(a,b):
            """>>> sum(1,1)
               2
               >>> sum(1,-1)
               0
            """
            return a+b
        
        # if you run this module using 'python mymodule.py', run a self test
        # if you just import this module, you get foo() and other definitions,
        # but the self-test isn't run
        if __name__=='__main__':
            import doctest
            doctest.testmod()
        

        【讨论】:

          【解决方案4】:
          猜你喜欢
          • 2017-11-29
          • 1970-01-01
          • 2011-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多