2010-08-20 54 views
1

我是新来的python子流程模块,目前我的实现没有多处理。多处理子流程

import subprocess,shlex 
    def forcedParsing(fname): 

     cmd = 'strings "%s"' % (fname) 
     #print cmd 
     args= shlex.split(cmd) 
     try: 
      sp = subprocess.Popen(args, shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
      out, err = sp.communicate() 
     except OSError: 
      print "Error no %s Message %s" % (OSError.errno,OSError.message) 
      pass 

     if sp.returncode== 0: 
      #print "Processed %s" %fname 
      return out 

    res=[] 
    for f in file_list: res.append(forcedParsing(f)) 

我的问题:

  1. 是sp.communicate去的好办法?我应该使用投票吗?

    如果我使用poll我需要一个sperate进程来监视进程是否正确完成?

  2. 我应该在for循环处分叉吗?

回答

2

关于问题2:在分叉for循环将主要加快速度如果脚本应该在具有多个内核/处理器的系统上运行。它会消耗更多的内存,并且会更加强调IO。在某个地方会有一个甜蜜点,取决于file_list中的文件数量,但只有在现实目标系统上进行基准测试才能知道它在哪里。如果你找到了这个数字,你可以添加一个if len(file_list) > <your number>:fork()'[编辑:而不是@tokland说的通过multiprocessing,如果它在你的Python版本(2.6+)上可用的话)可以选择最有效的策略 - 工作基础。

阅读关于Python的剖析这里:http://docs.python.org/library/profile.html

如果你是在Linux上,也可以运行timehttp://linuxmanpages.com/man1/time.1.php

+0

好的,我可以限制coz的分叉数量。 是的,我在linux上,文件列表可以达到10k +,所以可以这么说,像10个叉同时应该没问题(生产服务器将有8个内核,最多16GB的DDR3内存)。 – 2010-08-20 20:33:11

1

有在建议你使用communicate以避免与工艺阻塞问题的subprocess documentation几个警告,所以这将是使用一个好主意。

+0

以及subprocess.communicate等待..所以分叉将被阻止.. – 2010-08-20 20:40:05

+0

修正,它不要在多处理模块中阻塞(叉会工作,以及!) – 2010-11-19 01:12:06

3

1)subprocess.communicate()似乎是你正在尝试做的正确选择。并且您不需要轮询该过程,只有在完成时才进行通信()返回。

2)你的意思是分叉并列工作?看看multiprocessing(python> = 2.6)。使用子进程运行并行进程当然是可能的,但这是一项相当大的工作,你不能只调用正在阻塞的通信()。

关于你的代码:

cmd = 'strings "%s"' % (fname) 
args= shlex.split(cmd) 

为什么就不能?

args = ["strings", fname] 

至于这个丑陋的模式:

res=[] 
for f in file_list: res.append(forcedParsing(f)) 

您应该使用列表内涵尽可能:

res = [forcedParsing(f) for f in file_list] 
+0

好的答案也是,是的,我想使用多处理,但目前的Debian稳定只有高达2.5.x这吸吮..我可能会更改为后来gentoo/sabayon。 非常感谢您更正我的语法,这只是示例代码,实际上里面有一些条件语句,所以列表解析不会成为可能。如果我在循环中fork,subprocess.communicate会阻止对吗?这就是坏消息。 SO是否使用poll来代替?我只需要在程序退出时输出,而不是所有的时间。 – 2010-08-20 20:39:11

+2

您可以尝试多处理backport:http://code.google.com/p/python-multiprocessing/。 – tokland 2010-08-20 23:10:18