类定义

class HandlerLoop(object):
    def __init__(self):
        self.thread = None
        self.queue = queue.Queue()
        self.running = True
  • self.thread = None:持有线程对象的字段
  • self.queue = queue.Queue():请求队列
  • self.running = True:反映“处理循环是否该继续执行”的标记字段

启动、停止处理循环

def start(self):
        self.thread = threading.Thread(target=self.serve_forever)
        self.thread.start()

    def stop(self):
        self.running = False
  • start函数:创建任务执行线程,以serve_forever作为线程主函数
  • stop函数:把running标记设置为False。serve_forever函数内部的while循环条件判断中会查看此字段以决定是否终止循环

向处理循环提交执行请求

def submit(self, work_func, work_args, work_kwargs):
        item = (work_func, work_args, work_kwargs)
        self.queue.put(item)
  • 构造函数调用所必需的三元组,放入任务队列中

执行函数调用请求

def serve_forever(self):
        while self.running or self.queue.qsize():
            try:
                work_func, work_args, work_kwargs = self.queue.get(timeout=1)
                work_func(*work_args, **work_kwargs)
            except:
                continue
  • while self.running or self.queue.qsize():只要running标记为True,或者任务队列非空,处理循环都继续执行下去
  • work_func, work_args, work_kwargs = self.queue.get(timeout=1):从任务队列中获取函数调用的各个参数
  • work_func(*work_args, **work_kwargs):执行函数调用

完整代码如下

class HandlerLoop(object):

    def __init__(self):
        self.thread = None
        self.queue = queue.Queue()
        self.running = True

    def start(self):
        self.thread = threading.Thread(target=self.serve_forever)
        self.thread.start()

    def stop(self):
        self.running = False

    def submit(self, work_func, work_args, work_kwargs):
        item = (work_func, work_args, work_kwargs)
        self.queue.put(item)

    def serve_forever(self):
        while self.running or self.queue.qsize():
            try:
                work_func, work_args, work_kwargs = self.queue.get(timeout=1)
                work_func(*work_args, **work_kwargs)
            except:
                continue


def work_func(a, b, c):
    time.sleep(1)
    print('parameters: ', a, b, c)

    
if __name__ == '__main__':
    loop = HandlerLoop()
    loop.start()
    for i in range(6):
        loop.submit(work_func, (0, 6), {'c': 4})
    loop.stop()
    print('main thread exit')