Python:使用Pool,apply_async并加入

时间:2015-12-14 11:19:50

标签: python python-2.7 asynchronous subprocess python-multiprocessing

我需要运行一个shell脚本,该脚本从服务器获取文件并根据传递给它的参数写入磁盘。我需要为大约20多个不同的参数运行这个脚本,因此需要为每个参数并行运行它。

我尝试使用python中的Poolapply_asyncjoin来完成此操作。但它似乎没有用。以下是代码:

  import yaml
  from subprocess import call
  from multiprocessing import Pool

  feeder_server_conf = "/etc/feeder-servers.conf"
  with open("feed_conf.yaml", "r") as stream:
        feeds = yaml.load_all(stream)
        pool = Pool()
        for feed in feeds:
            for key, value in feed.items():
                keep_count_present = False
                name = value['name']
                age = value['age']
                if 'keep-count' in value:
                    keep_count = value['keep-count']
                    keep_count_present = True

                print "Pulling feed..."

                if keep_count_present:
                    command = "/usr/bin/pull-feed --name " + name + " --config " + feeder_server_conf + " --age " + str(age) + " --keep-count " + str(keep_count)
                else:
                    command = "/usr/bin/pull-feed --name " + name + " --config " + feeder_server_conf + " --age " + str(age)
                pool.apply_async(call, command.split())

        print "Waiting for pull-feeds to finish..."
        pool.close()
        pool.join()

代码只打印以下输出并退出而不拉动任何文件。不知道我在这里缺少什么。任何帮助表示赞赏。谢谢!

Pulling feeds...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Pulling feed...
Waiting for pull-feeds to finish...

我尝试执行的脚本在单独运行时工作正常(因此不是罪魁祸首)。我希望代码等到拉出所有文件。不知道我在这里缺少什么。我没有以正确的方式使用这些结构吗?任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:4)

这里的问题很简单,如documentation of subprocess.call g++ -std=c++11 -Wall中所述,第一个参数是列表,但call函数适用它的第二个参数列表为apply_async,这意味着您的通话最终会看起来像function(*args),而不是call('/usr/bin/pull-feed', '--name', ...)的使用方式。您需要做的就是将call替换为pool.apply_async(call, command.split()),将您的命令作为列表传递给pool.apply_async(call, [command.split()])的第一个参数,call使用的最终命令看起来像这个apply_async