在Python中线程化子进程

时间:2011-08-02 03:23:18

标签: python multithreading shell subprocess

如果我使用Python的线程库,我可以更快地完成一批子进程吗?比方说我需要将100个.wav文件转换为.mp3文件。如果我将'ffmpeg'包装在使用线程的Python脚本中,我可以更快地完成任务吗?线程是否允许我实际使用i7中可用的所有8个线程?

我最近偶然发现了一个Python脚本,该脚本ping主机列表,但利用线程来加快速度。这个剧本看起来很简洁,很容易让像我这样的初学者阅读和理解。所以这就是我的另一个问题:所有关于运行并行任务的讨论是如此复杂?也许我不理解并行和并行!=线程。如果这么简单那么为什么人们在现代处理器上运行时不会使用线程进行任何和所有批量转换?

3 个答案:

答案 0 :(得分:3)

这是一个简单而有效的解决方案。我经常使用它,它证明是非常有用的!此代码创建与核心一样多的线程,并允许它们执行(大量)任务(在这种情况下,调用shell程序):

import Queue
import threading
import multiprocessing
import subprocess

q = Queue.Queue()
for i in range(30): #put 30 tasks in the queue
    q.put(i)

def worker():
    while True:
        item = q.get()
        #execute a task: call a shell program and wait until it completes
        subprocess.call("echo "+str(item), shell=True) 
        q.task_done()

cpus=multiprocessing.cpu_count() #detect number of cores
print("Creating %d threads" % cpus)
for i in range(cpus):
     t = threading.Thread(target=worker)
     t.daemon = True
     t.start()

q.join() #block until all tasks are done

答案 1 :(得分:2)

如果正确使用,您的程序使用threading多线程肯定会让它更快,但您无法真正控制您的应用将使用多少处理器或内核因为它全部由操作系统处理,python中的multiprocessing模块是你可以采用的另一种方法,但如果你在尝试这些模块之前更详细地阅读这个主题会更好,我推荐这个{{3 }}

答案 2 :(得分:0)

你应该在python中使用多处理模块,因为你可以在你的计算机中使用多个核心。试试这个multiprocess module in python