python day Twelve

一、线程池(补充)

1.上下文管理  

2.终止线程池操作

例1.线程和队列

import queue
import threading

class ThreadPool(object):
    def __init__(self, max_num=20):         #max_num:固定队列参数20
        self.queue = queue.Queue(max_num)
        for i in range(max_num):            #往队列里边循环加线程
            self.queue.put(threading.Thread)
    def get_thread(self):                   #获取线程
        return self.queue.get()
    def add_thread(self):                   #增加线程,用于不断增加线程
        self.queue.put(threading.Thread)

pool = ThreadPool(10)           #定义线程池10个
def func(arg, p):
    print (arg)
    import time
    time.sleep(2)               #等待2s
    p.add_thread()              #上边执行完一个任务后,线程自动关闭,再手动增加一个线程到队列。

for i in range(30):             #有30个任务需要执行
    thread = pool.get_thread()   #从队列里获取一个线程
    t = thread(target=func, args=(i, pool))
    t.start()                   #启动线程
    
    
例2.上下文管理和终止线程操作

import queue
import threading
import contextlib
import time

StopEvent = object()
class ThreadPool(object):
    def __init__(self, max_num, max_task_num = None):
        if max_task_num:
            self.q = queue.Queue(max_task_num)
        else:
            self.q = queue.Queue()
        self.max_num = max_num
        self.cancel = False
        self.terminal = False
        self.generate_list = []
        self.free_list = []
    def run(self, func, args, callback=None):
        """
        线程池执行一个任务
        :param func: 任务函数
        :param args: 任务函数所需参数
        :param callback: 任务执行失败或成功后执行的回调函数,回调函数有两个参数1、任务函数执行状态;2、任务函数返回值(默认为None,即:不执行回调函数)
        :return: 如果线程池已经终止,则返回True否则None
        """
        if self.cancel:
            return
        if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:
            self.generate_thread()
        w = (func, args, callback,)
        self.q.put(w)

    def generate_thread(self):                      #创建一个线程
        t = threading.Thread(target=self.call)
        t.start()

    def call(self):                         #循环去获取任务函数并执行任务函数
        current_thread = threading.currentThread()
        self.generate_list.append(current_thread)
        event = self.q.get()
        while event != StopEvent:
            func, arguments, callback = event
            try:
                result = func(*arguments)
                success = True
            except Exception as e:
                success = False
                result = None
            if callback is not None:
                try:
                    callback(success, result)
                except Exception as e:
                    pass
            with self.worker_state(self.free_list, current_thread):
                #上下文管理,内部运行一个装饰器,具体内容看例3
                if self.terminal:
                    event = StopEvent
                else:
                    event = self.q.get()
        else:
            self.generate_list.remove(current_thread)

    def close(self):                        #执行完所有的任务后,所有线程停止
        self.cancel = True
        full_size = len(self.generate_list)
        while full_size:
            self.q.put(StopEvent)
            full_size -= 1
    def terminate(self):                    #无论是否还有任务,终止线程
        self.terminal = True
        while self.generate_list:
            self.q.put(StopEvent)
        self.q.queue.clear()
    @contextlib.contextmanager
    def worker_state(self, state_list, worker_thread):
        #用于记录线程中正在等待的线程数
        state_list.append(worker_thread)
        try:
            yield
        finally:
            state_list.remove(worker_thread)
# How to use
pool = ThreadPool(5)
def callback(status, result):
    # status, execute action status
    # result, execute action return value
    pass
def action(i):
    print(i)
for i in range(30):
    ret = pool.run(action, (i,), callback)

time.sleep(5)
print(len(pool.generate_list), len(pool.free_list))
print(len(pool.generate_list), len(pool.free_list))
# pool.close()            #等待任务结束之后,终止线程;终止线程池操作方法1.
pool.terminate()          #无论是否还有任务,终止线程;终止线程池操作方法2.

python 3.0官方上下文管理详见:https://docs.python.org/3/library/contextlib.html


二、redis 发布订阅


三、rabbitMQ


四、mysql


五、python pymysql模块


六、python ORM框架:SQLAchemy


七、python Paramiko模块


八、基于Paramiko模块来看堡垒机如何实现