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进程池语法和执行结果一样,只是需要导入的模块名称和调用的模块名称不同,在这就不再赘述。