concurrent包

欢迎指正

致力于自动化运维体系和运维技术的研究实践 | 青蛙兄blog

关注Python、GOlang语言在国内的推广、应用 | 青蛙兄blog

3.2版本引入的模块

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

提供了2个池执行器

ThreadPoolExecutor异步调用的线程池的Executor

ProcessPoolExecutor异步调用的进程池的Executor

ThreadPoolExecutor对象

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

方法含义
ThreadPoolExecutor(max_workers=1)池中至多创建max_workers个线程的池来同时异步执行,返回Executor实例
submit(fn,*args,**kwargs)提交执行的函数及其参数,返回Future实例
shutdown(wait=True)清理池

Future类

方法含义
result()可以查看调用的返回结果
done()如果调用被成功的取消或者执行完成,返回True
cancelled()如果调用被成功的取消,返回True
running()如果正在运行且不能被取消,返回True
cancel()尝试取消调用,如果已经执行且不能取消返回False,否则返回True
result(timeout=None)取返回的结果,超时为None,一直等待返回,超时设置到期,抛出concurrent.futures.TimeoutError异常
exception(timeout=None)取返回的异常,超时为None,一直等待返回;超时设置到期,抛出concurrent.futures.TimeoutError异常

ThreadPoolExecutor例子

import threading  
from concurrent import futures  
import time  
import logging  
  
logging.basicConfig(level=logging.INFO, format='%(thread)s %(threadName)s %(message)s')  
  
  
def worker(n):  
    logging.info('in work-{}'.format(n))  
    time.sleep(5)  
    logging.info('end work-{}'.format(n))  
  
  
# 创建线程池,池的容量为3  
executor = futures.ThreadPoolExecutor(3)  
  
fs = []  
  
for i in range(3):  
    f = executor.submit(worker, i)  # 返回Future对象,提交工作  
    fs.append(f)  
  
for i in range(3, 6):  
    f = executor.submit(worker, i)  
    fs.append(f)  
  
while True:  
    time.sleep(2)  
    logging.info(threading.enumerate())  
    flag = True  
    for f in fs:  
        flag = flag and f.done()  
  
    if flag:  
        executor.shutdown()  # 清理池  
        logging.info(threading.enumerate())  
        break

ProcessPoolExecutor例子

import threading  
from concurrent import futures  
import time  
import logging  
  
logging.basicConfig(level=logging.INFO, format='%(process)s  %(message)s')  
  
  
def worker(n):  
    logging.info('in work-{}'.format(n))  
    time.sleep(5)  
    logging.info('end work-{}'.format(n))  
  
if __name__ == '__main__':  
    # 创建进程池,池的容量为3  
    executor = futures.ProcessPoolExecutor(3)  
  
    fs = []  
  
    for i in range(3):  
        f = executor.submit(worker, i)  # 返回Future对象,提交工作  
        fs.append(f)  
  
    for i in range(3, 6):  
        f = executor.submit(worker, i)  
        fs.append(f)  
  
    while True:  
        time.sleep(2)  
        logging.info(threading.enumerate())  
        flag = True  
        for f in fs:  
            flag = flag and f.done()  
  
        if flag:  
            executor.shutdown()  # 清理池  
            logging.info(threading.enumerate())  
            break
import threading  
from concurrent import futures  
#concurrent.futures.ProcessPoolExecutor继承自concurrent.futures.base.Executor,而父类有enter、_exit方法,支持上下文管理,可以使用with语句  

with futures.ThreadPoolExecutor(max_workers=1) as executor:  
    future = executor.submit(pow,323,1235)  
    print(future.result())  
总结:
#统一了线程池,进程池调用,简化了编程
#是Python简单的思想哲学的体现
#唯一的缺点:无法设置线程名称

未经允许不得转载:青蛙兄博客 » concurrent包

赞 (5)

热门推荐