我是新來的蟒蛇和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