使用几个worker来执行python代码

时间:2014-04-25 18:11:24

标签: python

我在几个文件上执行python代码。由于文件都非常大,并且由于一个调用文件处理一个文件,因此它会持续很长时间直到最终文件被处理。因此,这是我的问题:是否可以使用几个并行处理文件的工作人员?

感谢任何提示。

Is this a possible invocation? :
Is this a possible invocation? : 
import annotation as annot # this is a .py-file
import multiprocessing

pool = multiprocessing.Pool(processes=4)
pool.map(annot, "")

.py文件使用for循环(等)来自行获取所有文件。 问题是:如果我查看了所有进程(使用' top'),我只会看到一个使用.py文件的进程。所以......我怀疑我不应该像这样使用多处理......是吗? 谢谢你的帮助! :)

4 个答案:

答案 0 :(得分:4)

是。使用multiprocessing.Pool

import multiprocessing
pool = multiprocessing.Pool(processes=<pool size>)
result = pool.map(<your function>, <file list>) 

答案 1 :(得分:2)

我的答案不仅仅是一个python答案,但我认为这是解决问题的最佳方法。

这只适用于Unix系统(OS X / Linux /等)。

我一直这样做,我爱上GNU Parallel。另请参阅introduction by the GNU Parallel developer。您可能需要安装它,但这是值得的。

这是一个简单的例子。假设您有一个名为processFiles.py的python脚本:

#!/usr/bin/python
# 
# Script to print out file name
#
fileName = sys.argv[0] # command line argument
print( fileName ) # adapt for python 2.7 if you need to

要使此文件可执行:

chmod +x processFiles.py

并说你所有的大文件都在largeFileDir。然后,使用四个处理器(-P4)并行运行所有文件,在命令行运行:

$ parallel -P4 processFiles.py ::: $(ls largeFileDir/*)

这将输出

file1
file3
file7
file2
...

它们可能不正常,因为每个线程并行独立运行。要使其适应您的流程,请插入文件处理脚本,而不是仅仅将文件愚蠢地打印到屏幕上。

在你的情况下,这比线程更可取,因为每个文件处理作业都将获得自己的Python解释器实例。由于每个文件都是独立处理的(或者听起来如此),因此线程过度。根据我的经验,这是并行处理您描述的流程的最有效方法。

有一些叫做Global Interpreter Lock的东西,我不太了解,但在尝试使用python内置函数进行超线程时,让我感到头疼。这就是为什么我说如果你不需要线程,不要。而是按照我的建议开始并启动独立的python进程。

答案 2 :(得分:1)

有很多选择。

  • 多线程
  • 多个流程
  • &#34;绿线&#34;,我个人喜欢Eventlet

然后还有更多&#34;企业&#34;解决方案,甚至可以在多个服务器上运行工作人员,例如Celery,更多搜索分布式任务队列python。

在所有情况下,您的方案将变得更加复杂,有时您将无法获得更多收益,例如如果您的处理受到I / O操作(读取数据)的限制,而不是通过计算和处理。

答案 3 :(得分:1)

是的,这是可能的。您应该调查threading modulemultiprocessing module。两者都允许您同时执行Python代码。但是,使用线程模块的一个注意事项是,由于Python的实现方式(Google&#34; python GIL&#34;如果您对细节感兴趣),一次只能执行一个线程,即使你有多个CPU核心。这与我们语言中的线程实现不同,其中每个线程将同时运行,每个线程使用不同的核心。由于这种限制,如果您希望同时执行CPU密集型操作,您将使用多处理模块获得更好的性能。