用于任务队列和周期性任务的多线程任务调度程序
taskutils的Python项目详细描述
#任务向导
taskutils是在python中实现多线程调度程序的工具。 它提供将任务排队和设置简单策略的方法,例如:
- 按此优先级执行一次
- 每10分钟执行一次
- 如果失败,请重试两次
- 同时执行不超过3个任务
它可以用来驱动需要并发的更复杂的程序,例如爬虫程序。
下面是用法示例:
###安装它
pip install taskutils
###导入相关对象
from taskutils import TaskHandler, Task, Recurrent
创建主任务处理程序对象
task_handler = TaskHandler(max_num_threads=3, sleep_seconds=2)
这将创建3个线程,每2秒等待任务排队
为一些简单的任务排队
def foo(k): print ‘hello world from task %s’ % k
- for k in range(10):
- task = Task(foo, kwargs=dict(k=k), priority=k, repeats_on_failure=3) task_handler.enqueue_task(task)
这将把10个任务(带有任意参数k=0…9)排队,这些任务将由 任务处理程序在空闲时线程如果任务失败,将重试3次,然后 丢弃的。请注意,任务包含一个函数(在本例中为foo)及其参数
###将重复任务排队
task = Task(foo, kwargs=dict(k=10), repeats_on_failure=0) task_handler.recurrent_tasks[‘abc’] = Recurrent(task, interval=3, repeats=5)
递归任务包装到Recurrent()对象中,必须命名(例如“abc”)。 周期性任务之所以命名,是因为它们不在正常队列中,而是始终执行 当他们的时间到了,有最大的优先权。在上面的示例中,执行“abc”任务 每3秒5次通过
del task_handler.recurrent_tasks[‘abc’]
###其他商品
from taskutils import LockWrapper with_a_lock = LockWrapper()
它定义了一个decorator,确保使用decorator调用的所有代码始终序列化,即使在不同的任务中调用:
@with_a_lock def f(): print ‘a’
@with_a_lock def g(): print ‘b’
task_handler.enqueue_task(Task(f)) task_handler.enqueue_task(Task(g))
这确保了函数f和g的执行永远不会并发。
##许可证
由Massimo di Pierro(http://experts4solutions.com)@2016 BSDV3许可证创建