浅谈concurrent.futures模块的进程池与线程池

Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,对编写线程池/进程池提供了直接的支持。

ProcessPoolExecutor进程池

我们来看一个最简单的进程池

 1 from concurrent.futures import ProcessPoolExecutor
 2 import  time
 3 def task(arg):
 4     print("arg:",arg)
 5     time.sleep(1)
 6 
 7 if __name__ == "__main__":
 8     start = time.time()
 9     pool = ProcessPoolExecutor(3) #设置线程数
10 
11     for i in range(6):
12         pool.submit(task,i) #在线程池中取一个线程执行task函数
13     pool.shutdown(wait=True) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
14 
15     print("main")
16     end = time.time()
17     print(end - start)

执行结果:

下面我们把shutdown(wait=True)改成shutdown(wait=False)

 1 from concurrent.futures import ProcessPoolExecutor
 2 import  time
 3 def task(arg):
 4     print("arg:",arg)
 5     time.sleep(1)
 6 
 7 if __name__ == "__main__":
 8     start = time.time()
 9     pool = ProcessPoolExecutor(3) #设置线程数
10 
11     for i in range(6):
12         pool.submit(task,i) #在线程池中取一个线程执行task函数
13     pool.shutdown(wait=False) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
14 
15     print("main")
16     end = time.time()
17     print(end - start)

再来看执行结果   

submit同步模式(同步调用:提交/调用一个任务,然后就在原地等着,等到该任务执行完毕拿到结果,再执行下一行代码

 1 from concurrent.futures import ProcessPoolExecutor
 2 import  time
 3 import os
 4 def task(arg):
 5     print('%s is piaoing %s' % (arg, os.getpid()))
 6     time.sleep(1)
 7 
 8 if __name__ == "__main__":
 9     start = time.time()
10     pool = ProcessPoolExecutor(3) #设置线程数
11 
12     for i in range(6):
13         pool.submit(task,i).result() #在线程池中取一个线程执行task函数
14         print(i)
15     pool.shutdown(wait=True) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
16 
17     print("main")
18     end = time.time()
19     print(end - start)

执行结果 

ThreadPoolExecutor线程池

我们来看一个最简单的线程池

 1 from concurrent.futures import ThreadPoolExecutor
 2   import  time
 3   def task(arg):
 4       print("arg:",arg)
 5       time.sleep(1)
 6   
 7   if __name__ == "__main__":
 8       start = time.time()
 9       pool = ThreadPoolExecutor(3) #设置线程数
10  
11      for i in range(6):
12          pool.submit(task,i) #在线程池中取一个线程执行task函数
13      pool.shutdown(wait=True) #wait参数如果为True则所有子进程都结束后才会执行父进程;如果参数为False,则父进程不需要等待子进程结束
14  
15      print("main")
16      end = time.time()
17      print(end - start)

运行结果

ThreadPoolExecutor线程池和ProcessPoolExecutor进程池语法和执行结果一样,只是需要导入的模块名称和调用的模块名称不同,在这就不再赘述。

原文地址:https://www.cnblogs.com/songtao1600/p/9014022.html