Skip to content

Latest commit

 

History

History
20 lines (11 loc) · 1.84 KB

README.md

File metadata and controls

20 lines (11 loc) · 1.84 KB

Task Queue

例子

执行example.py添加任务,用executor.py来执行任务,目前max_workers参数并不起作用...

需要执行函数必须可以import,如果在需要执行的函数所在的模块ENQUEUE,一定要避免加载模块的时候就直接ENQUEUE了(最好在if __name__ == '__main__',或者某个不会在加载模块就执行的作用域内),不然会造成死循环... 因为imp.load_source会加载并初始化那个模块,当时文档没看清,这个里曾经困扰我好久,任务越执行越多...



任务队列的大概思路是将需要执行的任务pickle后存储在Redis里,然后让Worker取出来执行。

如上所述,像rq一样只能用于执行本机的Python代码。不过这个更简单,目前没有优先级、没有超时机制、不能依赖于其它任务、非异步执行等等等,不过有重试机制...

tqueue.py里有四种队列,基于RedisQueue用来存储等待执行的任务,SuccessQueue存储执行成功(没有异常)的任务结果,FailQueue用于存储执行出现异常并需要重试的任务,DeadQueue用来存储用完重试次数也不能正确执行的任务异常信息。这里面task_id是一个关键值,将它们关联起来。

Worker 很简单,首先查看队列Queue里有没有等待执行的任务,如果有就执行;没有就看是否需要重试,如果需要重试查看队列FailQueue里是否有任务,有就执行,如果重试次数用完了,连同异常信息加入DeadQueue;如果不需要重试,会把出现异常的任务直接加入DeadQueue;若十秒内没有任务可执行,就打印运行状态。