3

所以我写了一个小的python脚本,它允许我指定一些包含视频文件的文件夹和一些输出目录,程序循环遍历所有的视频文件,并使用手刹将它们转换为:

proc = subprocess.Popen('HandBrakeCLI -i ... -o ...')
proc.wait()

所以它会一个接一个地执行目录中的每个文件。我有一台四核机器,想通过并行进行视频转换来加快速度,但我不完全了解如何处理。

我需要像 os.fork() 这样的东西吗?更像多处理模块的东西?我来自单线程 javascript 领域,所以这对我来说相对较新。

感谢您的任何意见!

4

2 回答 2

2

与此类似的东西应该可以解决问题:

import multiprocessing
...
def wrapper(currentfile):
    #create your commandline -- for the sake of simplicity, I assume that
    #the only thing that changes is the filename you are passing to
    #HandBrakeCLI (and that the filename is the last argument to pass)
    cmd='HandBrakeCLI -i ... -o ... '+currentfile 
    proc = subprocess.Popen(cmd)
    proc.wait()
    return 'foo'

files=os.listdir(path)  #Any way that you build up your list of files is fine
output = multiprocessing.Pool(4).map(wrapper,files) #output is ['foo', 'foo', ..., 'foo']

当然,这使用了一个类似map的函数,因为它的副作用是许多 python 人不喜欢的......但我发现它足够直观——尤其是如果你发表评论。我还让函数 return 'foo' 来证明你可以很容易地访问函数的返回值。

于 2012-05-22T17:18:40.723 回答
0

我建议使用特使库。在底层它使用线程库来生成新的命令行程序,所以如果你使用这样的connect函数:

import envoy
proc = envoy.connect('HandBrakeCLI -i ... -o ...')
while proc.status_code = None:
    sleep(5)

您可以一次生成任意多个,并等到一个退出再生成另一个。请注意,如果您有问题,我有一个带有我的修复程序的分支,您可能想要检查。

我在 shlex 库如何处理引号以及您的 cmd 行程序期望什么方面遇到了一个引用问题。而且,由于我在 Windows 上使用它,因此存在 posix/non-posix 模式问题。

于 2012-05-22T17:48:00.913 回答