如何限制python中活动线程的数量?

2024-06-10 17:16:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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来运行一个单独的命令行解码器(flac),该解码器通过管道传输到stdout,然后输入到一个命令行编码器(lame/mp3)。


Tags: selfsrcisstdout线程内核threadencode
3条回答

如果您使用的是默认的“cpython”版本,那么这对您没有帮助,因为一次只能执行一个线程;请查找Global Interpreter Lock。相反,我建议看看Python2.6中的multiprocessingmodule——它使并行编程变得简单。您可以使用2*num_threads进程创建一个Pool对象,并为它提供一系列要执行的任务。它将一次执行多达2*num_threads个任务,直到全部完成。

在工作中,我最近迁移了一组Python XML工具(different、xpath grepper和bulk xslt transformer)来使用它,并且在每个处理器有两个进程的情况下获得了非常好的结果。

如果要限制并行线程的数量,请使用semaphore

threadLimiter = threading.BoundedSemaphore(maximumNumberOfThreads)

class EncodeThread(threading.Thread):

    def run(self):
        threadLimiter.acquire()
        try:
            <your code here>
        finally:
            threadLimiter.release()

立即启动所有线程。除了maximumNumberOfThreads之外的所有线程都将在threadLimiter.acquire()中等待,并且等待线程只会在另一个线程通过threadLimiter.release()时继续。

“我的每个线程都在使用subprocess.Popen运行单独的命令行[进程]”。

为什么有一堆线程管理一堆进程?这正是操作系统为你做的。为什么要对操作系统已经管理的内容进行微管理?

与其用线程来监视进程,不如直接派生进程。您的进程表可能无法处理2000个进程,但它可以很容易地处理几十个(可能几百个)。

你想让的工作比你的CPU可能处理排队的工作多。真正的问题是内存,而不是进程或线程。如果所有进程的所有活动数据之和超过物理内存,则必须交换数据,这将减慢速度。

如果进程的内存占用相当小,那么可以有很多个进程在运行。如果你的进程有很大的内存占用,你不可能有很多运行。

相关问题 更多 >