用于任务队列和周期性任务的多线程任务调度程序

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许可证创建

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
相对于框架java窗口的鼠标位置错误   Java 8流peek api   java将数据附加到文件中   java使用ExoPlayer 2.8播放播放列表中的特定文件   JavaSpring国际化:如何动态设置语言环境值   java如何在mysql中实现两个表之间的两个关联   java在gradle可执行jar文件中包含运行时参数   surefire插件中的java maven多套测试套件   java试图理解堆分析以确定内存泄漏或所需的大量内存   java识别字符串有数字   数组如何解决错误“java.lang.ArrayIndexOutOfBoundsException:5”   java Swt文件对话框选择的文件太多?   java此登录代码易受SQL注入攻击吗?   Java[3]中的文件<identifier>预期编译错误   java如何在spring webflux中发送列表   jar中未找到java文件异常   如何在java中合并2D数组?   java如何评测本机JNI库