在Windows机器上的IPython控制台中进行多处理 – if __name_要求

我正在Windows机器上使用IPython和Spyder IDE。 当IDE启动时,会加载一组py文件来定义一些使我的工作更轻松的function。 一切都按预期工作。

现在我想升级其中的一个函数来使用多处理,但在Windows上,这需要if __name__ == "__main__":语句。 所以看起来我不能直接调用函数,并从IPython控制台传递参数。

例如,其中一个py文件(我们称之为test.py)可能看起来像下面的代码。

 import multiprocessing as mp import random import string # define a example function def rand_string(length, output): """ Generates a random string of numbers, lower- and uppercase chars. """ rand_str = ''.join(random.choice( string.ascii_lowercase + string.ascii_uppercase + string.digits) for i in range(length)) output.put(rand_str) def myFunction(): # Define an output queue output = mp.Queue() # Setup a list of processes that we want to run processes = [mp.Process(target=rand_string, args=(5, output)) for x in range(4)] # Run processes for p in processes: p.start() # Exit the completed processes for p in processes: p.join() # Get process results from the output queue results = [output.get() for p in processes] print(results) 

在我的IPython控制台中,我想使用该行

 myFunction() 

触发所有的计算。 但在Windows上最终得到一个BrokenPipe错误。

当我把

 if __name__ == "__main__": myFunction() 

在py文件的末尾,并运行完整的文件

 runfile(test.py) 

有用。 当然。 但是这使得传递参数非常困难,因为我总是需要编辑test.py文件本身。

我的问题是:如何获得多处理函数运行,而不是把它放在这里, if __name__ == "__main__":语句?

Solutions Collecting From Web of "在Windows机器上的IPython控制台中进行多处理 – if __name_要求"

所以,我解决了这个具体的问题。

  1. rand_string的定义放在一个名为test2的单独文件中。
  2. test2作为模块导入到我的test.py脚本中

    import test2 as test2

  3. 修改以下行以访问test2模块

     processes = [mp.Process(target=test2.rand_string, args=(5, output)) for x in range(4)] 
  4. 运行test.py

  5. 调用myFunction()

  6. 要开心 :)

该解决方案基于这个多处理教程 ,建议从另一个脚本导入目标函数。 这个解决方案绕过了if __name__ __-wrapper的安全自导入来访问目标函数。

如果不使用if __name__ == '__main__'运行multiprocessing功能将无法正常工作。

然而,你可以使用一个multiprocessing的分支,它基本上利用dill来将解释器会话当作一个文件来处理(简而言之,它是有效的)。

 Python 2.7.9 (default, Dec 11 2014, 01:21:43) Type "copyright", "credits" or "license" for more information. IPython 3.0.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: from pathos.multiprocessing import ProcessingPool as Pool In [2]: def squared(x): ...: return x**2 ...: In [3]: x = range(10) In [4]: p = Pool() In [5]: p.map(squared, x) Out[5]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] In [6]: res = p.imap(squared, x) In [7]: list(res) Out[7]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] In [8]: 

您可以使用内置的multiprocessing ,也可以使用dill序列化程序增强的功能,也可以使用Pool().apipe构建Queue ,这两者更像是您对Queue感兴趣的内容。

在这里获取悲哀: https : //github.com/uqfoundation