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

3 投票
1 回答
2221 浏览
提问于 2025-04-17 11:09

我正在写一个Python脚本,使用subprocess来运行rsync,然后获取输出并打印出来。这个脚本根据一个配置文件运行多个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)

我觉得这样做可能不是最好的选择——同时运行多个同步进程。我该怎么设置才能等一个进程完成后再开始下一个呢?

你可以在这里找到我的完整脚本:https://github.com/danielholm/BareShare/blob/master/bareshare.py

编辑:还有,我该怎么让self.rsyncRun在完成后停止?当rsync处理完所有文件后,它似乎还在继续运行,虽然其实不应该这样。

1 个回答

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()

撰写回答