python中限制线程的规范/标准方法

python中限制线程的规范/标准方法,python,concurrency,Python,Concurrency,我已经编写了一个脚本,它遍历某个目录中的文件,启动一个线程,并对文件执行一些操作。因为这些都是冗长、昂贵的操作,所以我将线程数量限制为比运行它的给定机器上的CPU数量少一个。然后,它不断检查活动线程的数量,如果有空闲容量,则启动另一个线程。对于返回机器上CPU数量的函数,我使用了 ncpus=detectCPUs() 对于os.walk(路径到根)中的(目录路径、目录名、文件名): 对于文件名中的文件名: 尽管如此: 如果threading.activeCount()

我已经编写了一个脚本,它遍历某个目录中的文件,启动一个线程,并对文件执行一些操作。因为这些都是冗长、昂贵的操作,所以我将线程数量限制为比运行它的给定机器上的CPU数量少一个。然后,它不断检查活动线程的数量,如果有空闲容量,则启动另一个线程。对于返回机器上CPU数量的函数,我使用了

ncpus=detectCPUs()
对于os.walk(路径到根)中的(目录路径、目录名、文件名):
对于文件名中的文件名:
尽管如此:
如果threading.activeCount()
我不禁感到,
threading
库中或python中的其他地方有一些函数可以自动为我完成这项工作,而无需我记录线程和CPU的数量。有人知道吗?或者指出经验丰富的老兵会怎么做


一些限制。我使用的共享机器只安装了Python2.5,我没有root权限安装东西。因此,
多处理
或需要Python2.6或更高版本的漂亮库是不可能的。

也许线程池实现就是您想要的

看起来是这样的:

pool = ThreadPool(num_threads)
for obj in objects:
    pool.add_task(obj.do_stuff, [arg1, arg2])
pool.wait_completion()    

即使不能升级Python,也可以使用多处理

是Python 2.6/3.0
多处理
包的后端口。[…]这个独立的变体旨在与Python2.4和2.5兼容,并将从PythonTrunk中获得其修复/改进

只需将其作为本地库安装即可


还有一些其他的“工作者/线程池”库,但您确实希望使用多处理,或者至少使用子进程。Python的GIL意味着“线程”通常在单个CPU上相互阻塞,这会降低吞吐量,并且比单线程进程要慢,尤其是在涉及I/O的情况下。

如果使用规范化Python,那么线程的帮助程度是有限的。规范化python使用全局解释器锁(GIL),它一次只允许执行一个python线程

但是,如果您的文件操作阻塞了很长一段时间,或者您正在使用用C编写的python库来释放GIL,那么线程将帮助您


我强烈建议您考虑多处理,因为这会让您避开te GIL

我想到了一个类似线程池的东西,它可以堆积你的线程作业,并在旧任务完成时批处理它们。。。但我知道的不多,无法回答。投票赞成知道有用。不幸的是,它似乎不再像我现在拥有的那样“标准化”。线程池是编程中相当标准的模式。()如果Python中没有内置的实现,那么使用它并不是件坏事。我不知道它是向后兼容的。谢谢你的信息!投票赞成提供信息。
pool = ThreadPool(num_threads)
for obj in objects:
    pool.add_task(obj.do_stuff, [arg1, arg2])
pool.wait_completion()