Python多处理:如何强制命令执行的优先顺序

Python多处理:如何强制命令执行的优先顺序,python,multiprocessing,Python,Multiprocessing,我需要通过多处理运行一系列独立的子进程调用。我事先知道,这些工作中的一些会比其他工作慢几个数量级。为了有效地利用处理器时间,我认为应该先将缓慢的作业排队。通过这种方式,我希望避免出现一种奇怪的情况,即一个长时间运行的作业排在最后,而其余处理器处于空闲状态。在这种特殊情况下,实际结果是否按顺序生成并不重要(因为各个进程创建的文件仅在所有进程完成后使用)。但重要的是,速度慢的作业首先/优先安排。我的第一个问题是,我如何做到这一点 即使读了这本书,我还是有点困惑。因此,我的第二个问题是:在这种情况下,

我需要通过多处理运行一系列独立的子进程调用。我事先知道,这些工作中的一些会比其他工作慢几个数量级。为了有效地利用处理器时间,我认为应该先将缓慢的作业排队。通过这种方式,我希望避免出现一种奇怪的情况,即一个长时间运行的作业排在最后,而其余处理器处于空闲状态。在这种特殊情况下,实际结果是否按顺序生成并不重要(因为各个进程创建的文件仅在所有进程完成后使用)。但重要的是,速度慢的作业首先/优先安排。我的第一个问题是,我如何做到这一点

即使读了这本书,我还是有点困惑。因此,我的第二个问题是:在这种情况下,我应该使用
Pool.map()
而不是
Pool.map\u async()
,还是其他什么

我尝试了
map()
map\u async()
,但一开始我没有观察到这两种方法的预期行为。下面的示例运行进程,这些进程除了创建一个文件和睡眠之外没有什么作用

import subprocess
import multiprocessing
import time
import os
import glob
import sys

NUM_PROCS = 2

def work(cmd):
    return subprocess.call(cmd, shell=True)

def generate_cmds(n=10):
    for i in xrange(n):
        yield "sleep 2 && touch %d.log" % (i)

def main():
    assert len(sys.argv)==2, ("missing arg: async=[0|1]")
    async = sys.argv[1]=='1'

    results = []
    pool = multiprocessing.Pool(processes=NUM_PROCS)
    if async:
        print "map_async()"
        p = pool.map_async(work, generate_cmds(), callback=results.extend) 
        p.wait()# or p.close() and p.join()
    else:
        print "map()"
        results = pool.map(work, generate_cmds())

    print "results: %s" % (results)
    for f in glob.glob("[0-9]*.log"):
        print f, time.strftime('%H:%M:%S', 
                               time.localtime(os.path.getmtime(f)))

if __name__ == "__main__":
    main()
我假设创建文件的时间戳应该与
map()
情况下的命令顺序相匹配,因为所有进程完成所需的时间大致相同,但它们不会(如果我不使用chunksize)。似乎所有其他命令都同时运行:

$ python subp.py 0
map()
results: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0.log 14:36:57
1.log 14:36:59
2.log 14:36:57
3.log 14:36:59
4.log 14:37:01
5.log 14:37:03
6.log 14:37:01
7.log 14:37:03
8.log 14:37:05
9.log 14:37:07
我知道这可以通过使用chunksize 1来解决,但我不明白为什么(有人能解释一下吗?)。我的最后一个问题是:这是否意味着我应该使用
map\u async(chunksize=1)
进行设置

谢谢, 安德烈亚斯


PS:我正在使用Python 2.7,以防它有问题。

回答我自己的问题:

在我的例子中,使用map()还是map_async()并不重要,因为结果的顺序并不重要。然而,队列顺序/执行顺序是错误的,因此将chunksize设置为1很重要(yopy提供的链接为我提供了最终线索)。每个处理器将运行chunksize迭代,chunksize是自动确定的。这可能会产生不必要的副作用,即慢速作业(首先排队)被分配给一个(或少数)处理器,而不是平均分布在多个处理器之间


安德烈亚斯

请你读一下这篇文章,你会对区块大小有所了解。这就解释了示例代码的行为。既然已经解释了块大小,那么现在的问题是什么?如果您想要顺序,为什么要使用
多处理
?如果你只想做一些连续的计算,那么你不能依赖计时。如果你想要任何类型的同步,你必须使用一些,比如.Hi Janne,在阅读了yopy提供的chunksize链接之后,我理解了现在发生的事情,现在我能够回答我所有的问题。如果yopy将其添加为答案,而不是评论,我会将其标记为正确。嗯?我想这是sjcipher的链接。不知道为什么我多次提到错误的名字。