在foreach循环中运行多个子进程?一个当时?

时间:2012-01-26 15:48:24

标签: python pygtk subprocess rsync

我正在创建一个使用子进程运行rsync的python脚本,然后获取stdout并打印它。 该脚本使用以下代码在conf文件上运行多个rsync进程库:

for share in shares.split(', '):
  username = parser.get(share, 'username')
  sharename = parser.get(share, 'name')
  local = parser.get(share, 'local')
  remote = parser.get(share, 'remote')
  domain = parser.get(share, 'domain')
  remotedir = username+"@"+domain+":"+remote
  rsynclog = home + "/.bareshare/"+share+"rsync.log"
  os.system("cp "+rsynclog+" "+rsynclog+".1 && rm "+rsynclog) # MOve and remove old log
  rsync="rsync --bwlimit="+upload+" --stats --progress -azvv -e ssh "+local+" "+username+"@"+domain+":"+remote+" --log-file="+rsynclog+" &"
  # Run rsync of each share
  #         os.system(rsync) 
  self.rsyncRun = subprocess.Popen(["rsync","--bwlimit="+upload,"--stats","--progress","-azvv","-e","ssh",local,remotedir,"--log-file="+rsynclog], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

我认为这可能不是最好的事情 - 在sime时间运行多个同步。我怎么能设置这个,所以我等待一个进程在下一个进程开始之前完成?

您可以在此处找到我的完整脚本:https://github.com/danielholm/BareShare/blob/master/bareshare.py

编辑:如何在完成后使self.rsyncRun死掉?当rsync完成所有文件后,它似乎仍在继续,尽管它不应该这样做。

1 个答案:

答案 0 :(得分:4)

调用

self.rsyncRun.communicate()

将阻止主进程,直到rsyncRun进程完成。


如果你不想阻止主进程,那么产生一个线程来处理对subprocess.Popen的调用:

import threading

def worker():
    for share in shares.split(', '):
        ...
        rsyncRun = subprocess.Popen(...)
        out, err = rsyncRun.communicate()

t = threading.Thread(target = worker)
t.daemon = True
t.start()
t.join()