Python手写Request Handler Loop
原创
©著作权归作者所有:来自51CTO博客作者Gossiper的原创作品,请联系作者获取转载授权,否则将追究法律责任
类定义
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')