concurrent.futures线程池进程池

线程池和进程池的用法

Python的concurrent库当中提供了Thread、Process之上的高级的API,可以利用其来高效(同时指编码和运行效率)的实现并发。

使用future.ThreadPoolExecutor来初始化线程池执行器。可以仅仅指定一个参数就是线程池当中线程的数量。

可以在with上下文当中使用线程池,这样执行完毕后线程池会自动关闭。

    with futures.ThreadPoolExecutor(worker_num) as executor:
        res = executor.map(func, iter)

可以通过executor的map函数向线程池提交工作,其工作和普通的map函数类似,第一个参数是执行的工作函数,第二个参数是一个可迭代对象,结果会以生成器的形式返回。

错误处理

需要注意的是,默认情况下,在线程池内部的错误不会使得应用程序终止,而是会返回在res结果当中

解释器锁

Python实际是单线程的,某个线程在解释字节码的时候会获得解释器级别的锁,在Python当中一个进程在一个时刻只会有一个线程在被执行。但这并不是说线程不会提高效率,在IO密集的程序当中,很多时候,程序会被阻塞,这样的环境下,线程能大大提高效率,如果要实现真正的并发,可以将ThreadPoolExecutor换为ProcessPoolExecutor,其余用法相似。