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

时间:2011-02-13 08:03:08

标签: python concurrency

我编写了一个脚本,它遍历某个目录中的文件,启动一个线程并对文件执行某些操作。因为这些是冗长而昂贵的操作,所以我将线程数限制为比我在运行它的给定机器上找到的cpus数少一个。然后它会不断检查活动的线程数,如果有剩余容量,则启动另一个线程。对于返回计算机上cpu数量的函数,我使用了this

ncpus = detectCPUs()

for (dirpath, dirnames, filenames) in os.walk(path_to_root):
    for filename in filenames:
        while True:
            if threading.activeCount() < ncpus - 1:
                MyThread(dirpath, filename).start()
                break
            else:
                time.sleep(100)

我无法摆脱threading库或python中其他地方的函数的感觉,这些函数会自动为我执行此操作而不必密切关注线程和cpus的数量。有人会知道吗?或指出经验丰富的退伍军人会如何做到这一点?

一些限制。我使用的共享机器只安装了python 2.5,我没有root权限来安装东西。所以multiprocessing或者需要python 2.6或更高版本的好库是不可能的。

3 个答案:

答案 0 :(得分:2)

也许你想要的线程池实现是什么?

http://code.activestate.com/recipes/577187/

它看起来像那样:

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

答案 1 :(得分:2)

即使您无法升级Python,您仍然可以使用多处理。

  

multiprocessing是Python 2.6 / 3.0 multiprocessing包的后端。 [...]这个独立版本旨在与Python 2.4和2.5兼容,并将从python-trunk中获取其修复/改进。

只需将其安装为本地库。

还有一些其他的“工作者/线程池”库,但你真的想要至少使用多处理或子进程。 Python的GIL意味着“线程”经常在单个CPU上相互阻塞,从而降低吞吐量并且比流程是单线程的更慢,尤其是涉及I / O时。

答案 2 :(得分:0)

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

但是如果你的文件操作阻塞了很长一段时间,或者你正在使用一个用C语言写的释放GIL的python库,那么线程会帮助你。

我强烈建议您查看多处理,因为这样可以让您回避GIL。