我是新来的蟒蛇和threading
- 做一些音乐文件转换,并希望能够利用我的机器上的多个核心(每个核心一个活动转换线程)的一些进展。如何限制python中活动线程的数量?
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()
一切正常,所有的文件得到编码,bravo! ...然而,所有的进程立即产卵,但我只想一次运行两个(每个核心一个)。一旦完成,我希望它移动到列表中的下一个,直到完成,然后继续执行程序。
我该怎么做?
(我已经看过了线程池和队列功能,但我无法找到一个简单的答案。)
编辑:也许我应该补充一点,我的每个线程的使用subprocess.Popen
运行单独的命令行解码器(flac)通过管道输入命令行编码器(lame/mp3)。
为什么要麻烦?让你的线程相互竞争有什么问题?让每个核心彻底饱和工作会更快。 – 2009-11-24 02:34:43
好吧,我想我没有这样想过......拥有超过2000个文件的音乐库,我认为同时产生(同时)2,000个解码过程(flac)到2,000个编码过程(跛脚)将是次优的。我错了吗? – thornomad 2009-11-24 02:39:53
@thornomad:是的,你错了。由于您拥有2个内核,因此仅限于2个进程是错误的。一个过程不会让工作核心饱和。即使是由三部分组成的流程管线也可能具有足够的I/O,以致内核未被完全占用。 – 2009-11-24 03:08:25