【发布时间】:2010-12-19 17:35:33
【问题描述】:
我是 python 新手,在threading 方面取得了一些进展——我正在做一些音乐文件转换,并希望能够利用我机器上的多个内核(每个内核一个活动转换线程)。
class EncodeThread(threading.Thread):
# this is hacked together a bit, but should give you an idea
def run(self):
decode = subprocess.Popen(["flac","--decode","--stdout",self.src],
stdout=subprocess.PIPE)
encode = subprocess.Popen(["lame","--quiet","-",self.dest],
stdin=decode.stdout)
encode.communicate()
# some other code puts these threads with various src/dest pairs in a list
for proc in threads: # `threads` is my list of `threading.Thread` objects
proc.start()
一切正常,所有文件都已编码,太棒了! ...但是,所有进程都会立即产生,但我只想一次运行两个(每个核心一个)。一个完成后,我希望它移动到列表中的下一个,直到完成,然后继续执行该程序。
我该怎么做?
(我查看了线程池和队列函数,但找不到简单的答案。)
编辑: 也许我应该补充一点,我的每个线程都使用subprocess.Popen 运行一个单独的命令行decoder (flac),通过管道传输到输入的标准输出命令行编码器 (lame/mp3)。
【问题讨论】:
-
何必呢?让你的线程相互竞争有什么问题?让每个核心都充满工作会更快。
-
好吧,我想我没有这样想过......拥有超过 2,000 个文件的音乐库,我认为(同时)产生 2,000 个解码过程(flac)到 2,000 个编码过程(跛脚)同时将是次优的。我错了吗?
-
@thornomad:是的,你错了。因为你有 2 个核心而将自己限制在 2 个进程中是错误的。一个过程不会使核心充满工作。即使是由三部分组成的流程管道也可能有足够的 I/O,以至于内核没有被完全占用。
-
如果您的每个进程需要超过 1/2000 的物理内存,您可能会因为无法分配足够的内存或者更糟糕的机器将交换到死而导致进程死亡...
标签: python multithreading