1、concurrent包

  此包3.2版本之后引入,只提供了一个模块futures

  异步并行任务编程模块,提供了一个高级的异步可执行的便利接口。

  提供了两个池执行器

    ThreadPoolExecutor 异步调用的线程池 的 Executor

    ProcessPoolExeutor 异步调用的进程池的 Executor

2、ThreadPoolExecutor 对象 -- 线程

  首先需要定义一个池的执行器对象,Executor类子类对象。

  Python-多线程+多进程包(concurrent包,处理并发)    

  Future类

  Python-多线程+多进程包(concurrent包,处理并发)

 

  测试:IO 密集型测试,创建一个线城池,开启三个线程,因为此模块没有提供join方法,所以通过编程来实现主线程等待。

 1 import threading
 2 from concurrent import futures
 3 
 4 import logging
 5 import time
 6 
 7 FORMAT = '%(asctime)-15s\t  %(process)s %(threadName)s %(process)s %(message)s'
 8 logging.basicConfig(level=logging.INFO, format=FORMAT)
 9 
10 # 这是一个IO 密集型的函数,建议使用多线程
11 def worker(n):
12     logging.info('begin to work{}'.format(n))
13     time.sleep(5)
14     logging.info('finisdhed{}'.format(n))
15     return n
16 
17 # 创建线程池,容量为3个
18 executor = futures.ThreadPoolExecutor(max_workers=3)
19 
20 fs = []
21 for i in range(3):
22     # 提交任务
23     future = executor.submit(worker, i)
24     fs.append(future)
25 
26 
27 while True:
28     time.sleep(1)
29     logging.info(threading.enumerate())
30 
31     flag = True
32     for f in fs:
33         logging.info(f.done())
34         flag = flag and f.done()
35 
36     if flag:
37         for f in fs:
38             logging.info('the ans is {}'.format(f.result()))
39         executor.shutdown()
40         logging.info(threading.enumerate())
41         break
42 
43 logging.info('--------------------')
线程数=池容量

相关文章: