美文网首页
python 并发 concurrent.futures

python 并发 concurrent.futures

作者: 落羽归尘 | 来源:发表于2019-08-24 16:32 被阅读0次

concurrent.futures

concurrent.futures是python3内置模块,用于并发。

ThreadPoolExecutor

先看下面例子:

import time

from concurrent import futures

def test(i):
    time.sleep(1)
    print("i:%d" % i)

start = time.time()
with futures.ThreadPoolExecutor(4) as ex:
    r = ex.map(test, list(range(8)))

print(list(r))

print(time.time()-start)
输出结果:
i:0
i:3
i:2
i:1
i:4
i:7
i:6
i:5
[None, None, None, None, None, None, None, None]
2.0052473545074463

很明显,若用单线程,执行时间应该是8s,这里开了4个线程,执行时间只用了2s。

  • ThreadPoolExecutor中参数表示线程的个数
  • map方法返回一个生成器,获取各个函数的返回值

下面再看一个例子

import time

from concurrent import futures

def test(i):
    time.sleep(1)
    print("i:%d" % i)
    return i

start = time.time()
with futures.ThreadPoolExecutor(4) as ex:
    to_do=[]
    for i in range(8):
        future = ex.submit(test, i)
        to_do.append(future)

    for future in futures.as_completed(to_do):
        print(future.result())


print(time.time()-start)
输出结果:
i:2
i:3
i:1
i:0
2
1
3
0
i:7
i:4
i:5
7
i:6
4
5
6
2.017911672592163
  • submit方法的参数是一个可调用的对象,调用这个方法后会返回一个future。不阻塞。
  • as_completed会等test结束后才会返回
  • 因此future.result()直接获取到future的最终结果,无阻塞

ProcessPoolExecutor

由于pythonGIL的存在,使得同一时刻只会有一个CPU工作,对于CPU密集型,多线程无法发挥多CPU的优势,这个时候可以使用ProcessPoolExecutor 多进程,使用方法和ThreadPoolExecutor类似。

当然,concurrent中的并发不是很灵活,如果想要更灵活的使用多线程多进程,可以使用 threading和multiprocessing 模块。

相关文章

网友评论

      本文标题:python 并发 concurrent.futures

      本文链接:https://www.haomeiwen.com/subject/synfectx.html