2010-08-20 51 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