一个简单、灵活的调度程序,用于分布式工作池。
redbike的Python项目详细描述
#redbike
是一个简单、灵活的调度程序,适用于分布式工作人员池。
redbike是一个有用的构建块,具有故意限制的功能。
它很容易安排和分发工作,但是您喜欢。
redbike可以从python包索引中获得:
``bash
$pip install redbike
`````
`high level
redbike有一个简单的设计,以redis中的一些数据结构为中心。
*作业计划的注册表(a[hash](http://redis.io/topics/data types/hash))
*作业状态的注册表(另一个[hash](http://redis.io/topics/data types/hash))格式:"event:timestamp"
*计划工作的时间线(a[sorted集](http://redis.io/topics/data types排序集)按下一次运行的时间戳评分)
*任何数量的作业队列([列表](http://redis.io/topics/data types列表))
*将在时间线上到期的工作排队的单个调度程序进程
*过期键以跟踪已开始运行但尚未返回或超时的作业。
*任意数量的工作进程
还需要知道如何连接到redis。默认情况下,它会出现在
`.redbike.conf`中,但您可以指定任何文件。
连接信息可以在`[redbike redis]`节中找到,并且
会镜像py redis'`strictredis`类的参数。剩下的
设置可以在`[redbike]`stanza中找到。
配置文件中的其他信息被忽略,因此只要共享配置中有类似的内容,就可以使用它:
``ini
[redbike]
前缀:myapp
worker:somepackage.somemodule:myworkerclass('initstring')
time file:/var/log/myapp.redbike.time在python中:
``python
python
bike=redbike(myworkerclasclass('initstring'),
prefix='myapp',
timefile='/var/log/myapp.redbike.redbike.timefile')
```````
`````````
````````
````````
````````````
>>````````````````````````````要运行的时间戳redbike中的作业只需输入作业ID和计划。日程表可以是iCal[rrule]格式(http://www.kanzaki.com/docs/iCal/rrule.html)
或以下特殊值之一:
*`now`-立即运行一次
*`at:timestamp`-在指定时间运行一次
*`continue`-立即重新排队
*`stop`-不再运行
错误的时间文件(见下文)
,调度每个作业的时间(或是否)将基于此值。
set操作不会等待调度程序,而是将作业直接输入到时间线或工作队列中
合适的位置。
python中:
``python
``bike.set('job1:a','now')
````
dispatch而时间文件
``bash
$redbike dispatch[<;worker>;][--schedules=<;schedulescsv>;[--after=<;timestamp>;]]
````
。
dispatcher会使用
current timesta更新时间文件的内容当它运行的时候。当启动调度或设置
计划时,时间文件中的时间用于确定
作业下次运行的时间和时间。如果未提供`--after`
参数且找不到时间文件,则默认值为当前时间
。
还可以提供作业ID的CSV、计划对。这些计划
将在发货开始前设置。
r的"work()"方法。
如果引发"stopwork",则作业的计划设置为"stop"。如果引发"unset job"
,则该作业将被取消设置(从轮换中移除)。如果引发任何其他异常,则会记录该异常,并且不会重新安排作业。如果作业花费的时间超过超时时间,则也不会重新安排。否则,将检查作业的计划,如果合适,它将返回队列或时间线。
只需重写其"work()"方法。
`` python
mymodule.py
来自redbike import roundrobin,stop work
class worker(roundrobin):
def work(self,jobid):
should_stop=do_something(jobid)
if should_stop:
提高stopwork("不要再运行此作业!")
``
此类根据最后一个`:``后面的
作业ID部分选择工作队列。它由一个冒号
分隔的字符串初始化,该字符串指定要工作的队列以及工作队列的顺序。例如,如果您想将作业
放入两个队列,并使队列"a"的工作频率是队列"b"的两倍,那么这就可以做到:
``bash
$redbike set job1:a continue
$redbike set job2:b continue
$redbike work mymodule:work("a:b")
````
`backoff
有"继续"计划的员工有时可能希望引入退避。worker的"work()"方法可以返回backoff seconds的整数值,并且在指定的backoff结束后,作业
将被输入到要排队等待
再次工作的时间线中。
ey
具有过期时间和唯一值以标记该场合。当
工作进程正常完成时,它将删除该密钥并重新安排日程。
如果该密钥不再存在或该值已更改,则认为它已超时,将不会重新安排日程。此行为
防止工作进程执行在工作
作业时可能发生的计划更改(通常是由"set()"和"unset()"所做的更改)。
只需定义一个timeout(self,queue\u name),并返回一个整数
作为超时值(以秒为单位),或者返回"none",即可使用默认超时值。
默认超时值为10秒。您还可以在配置节中用"默认超时"设置覆盖
。
cher和worker进程监视redis中的控制键
设置为"halt",并在完成当前任务后立即停止。
如何处理这个问题取决于你对同一个计划的事情的看法,比如当一个工作失败或烧掉时,你会有两次工作或者错过。也就是说,有几个命令可以帮助
。
/>
输出为csv格式。
redbike作业的整个生命周期都设置状态。
*tml-输入时间线
*enq-输入工作队列
*bad-由于坏的rrule而未能计划
*wrk-由工人拾取Rked raise stopwork
*模具工引发意外异常
以转储所有作业的计划:
`` bash
$redbike sschedules
jobid,schedule
jobid,schedule
…
````
/>"status":"enq:1381720578",
"next-run":空,
"schedule":"continue"
}
````
如果它已经在运行,则无法完成,否则
将被删除且无法工作。
是一个简单、灵活的调度程序,适用于分布式工作人员池。
redbike是一个有用的构建块,具有故意限制的功能。
它很容易安排和分发工作,但是您喜欢。
redbike可以从python包索引中获得:
``bash
$pip install redbike
`````
`high level
redbike有一个简单的设计,以redis中的一些数据结构为中心。
*作业计划的注册表(a[hash](http://redis.io/topics/data types/hash))
*作业状态的注册表(另一个[hash](http://redis.io/topics/data types/hash))格式:"event:timestamp"
*计划工作的时间线(a[sorted集](http://redis.io/topics/data types排序集)按下一次运行的时间戳评分)
*任何数量的作业队列([列表](http://redis.io/topics/data types列表))
*将在时间线上到期的工作排队的单个调度程序进程
*过期键以跟踪已开始运行但尚未返回或超时的作业。
*任意数量的工作进程
还需要知道如何连接到redis。默认情况下,它会出现在
`.redbike.conf`中,但您可以指定任何文件。
连接信息可以在`[redbike redis]`节中找到,并且
会镜像py redis'`strictredis`类的参数。剩下的
设置可以在`[redbike]`stanza中找到。
配置文件中的其他信息被忽略,因此只要共享配置中有类似的内容,就可以使用它:
``ini
[redbike]
前缀:myapp
worker:somepackage.somemodule:myworkerclass('initstring')
time file:/var/log/myapp.redbike.time在python中:
``python
python
bike=redbike(myworkerclasclass('initstring'),
prefix='myapp',
timefile='/var/log/myapp.redbike.redbike.timefile')
```````
`````````
````````
````````
````````````
>>````````````````````````````要运行的时间戳redbike中的作业只需输入作业ID和计划。日程表可以是iCal[rrule]格式(http://www.kanzaki.com/docs/iCal/rrule.html)
或以下特殊值之一:
*`now`-立即运行一次
*`at:timestamp`-在指定时间运行一次
*`continue`-立即重新排队
*`stop`-不再运行
错误的时间文件(见下文)
,调度每个作业的时间(或是否)将基于此值。
set操作不会等待调度程序,而是将作业直接输入到时间线或工作队列中
合适的位置。
python中:
``python
``bike.set('job1:a','now')
````
dispatch而时间文件
``bash
$redbike dispatch[<;worker>;][--schedules=<;schedulescsv>;[--after=<;timestamp>;]]
````
dispatcher会使用
current timesta更新时间文件的内容当它运行的时候。当启动调度或设置
计划时,时间文件中的时间用于确定
作业下次运行的时间和时间。如果未提供`--after`
参数且找不到时间文件,则默认值为当前时间
。
还可以提供作业ID的CSV、计划对。这些计划
将在发货开始前设置。
r的"work()"方法。
如果引发"stopwork",则作业的计划设置为"stop"。如果引发"unset job"
,则该作业将被取消设置(从轮换中移除)。如果引发任何其他异常,则会记录该异常,并且不会重新安排作业。如果作业花费的时间超过超时时间,则也不会重新安排。否则,将检查作业的计划,如果合适,它将返回队列或时间线。
只需重写其"work()"方法。
`` python
mymodule.py
来自redbike import roundrobin,stop work
class worker(roundrobin):
def work(self,jobid):
should_stop=do_something(jobid)
if should_stop:
提高stopwork("不要再运行此作业!")
``
此类根据最后一个`:``后面的
作业ID部分选择工作队列。它由一个冒号
分隔的字符串初始化,该字符串指定要工作的队列以及工作队列的顺序。例如,如果您想将作业
放入两个队列,并使队列"a"的工作频率是队列"b"的两倍,那么这就可以做到:
``bash
$redbike set job1:a continue
$redbike set job2:b continue
$redbike work mymodule:work("a:b")
````
`backoff
有"继续"计划的员工有时可能希望引入退避。worker的"work()"方法可以返回backoff seconds的整数值,并且在指定的backoff结束后,作业
将被输入到要排队等待
再次工作的时间线中。
ey
具有过期时间和唯一值以标记该场合。当
工作进程正常完成时,它将删除该密钥并重新安排日程。
如果该密钥不再存在或该值已更改,则认为它已超时,将不会重新安排日程。此行为
防止工作进程执行在工作
作业时可能发生的计划更改(通常是由"set()"和"unset()"所做的更改)。
只需定义一个timeout(self,queue\u name),并返回一个整数
作为超时值(以秒为单位),或者返回"none",即可使用默认超时值。
默认超时值为10秒。您还可以在配置节中用"默认超时"设置覆盖
。
cher和worker进程监视redis中的控制键
设置为"halt",并在完成当前任务后立即停止。
如何处理这个问题取决于你对同一个计划的事情的看法,比如当一个工作失败或烧掉时,你会有两次工作或者错过。也就是说,有几个命令可以帮助
。
/>
输出为csv格式。
redbike作业的整个生命周期都设置状态。
*tml-输入时间线
*enq-输入工作队列
*bad-由于坏的rrule而未能计划
*wrk-由工人拾取Rked raise stopwork
*模具工引发意外异常
以转储所有作业的计划:
`` bash
$redbike sschedules
jobid,schedule
jobid,schedule
…
````
/>"status":"enq:1381720578",
"next-run":空,
"schedule":"continue"
}
````
如果它已经在运行,则无法完成,否则
将被删除且无法工作。