Python 有什么比较轻量的库可以提供 crontab 的功能并且带有 task queue 的功能呢?

2016-01-08 15:06:28 +08:00
 tywtyw2002
对于 Python 来说不知道有没有什么比较轻量级的 task 库可以支持如下操作:

1. 可以实现重复执行某个 task 。(每 10 分钟 polling 一次网站,并且检查相关信息)
2. 多 task 支持。(同样的 task 但用不同的参数,每个有着不同参数的 task 是独立的)
3. 可以实现对 task 运行时间的控制(如 task 只在周 1-5 的 7 : 00~23 : 00 运行)
4. 支持 events 。 (例如: task 产生 A Exception ,则直接执行 X 操作,并且在 X 操作结束后再次执行这个 task 。(临时加的一次 task ,不改变之前的调度))
5. 支持 task 移除 (在达到指定条件后,可以移除某个在调度中的 task ,如果全部 task 都被移除了,那么程序关闭。)


一些解释说明:
1. 之前这个程序用 time.sleep 实现的 task 调度,对于多 task 的处理就是开了 n 个程序。
2. 对于上面第四点来说,因为有很多不同的 Exception ,我并不想把异常处理写在 task 里面,而是 task 产生异常之后,插入一个 X 操作去处理这个异常,并且在这个异常没有处理掉之前暂停这个 task 的调度。
3. 目前程序很小,也不像做的太复杂,所以不大想用分布式 queue/worker 这样的的架构。最好是一个 process ,也可以一个 process 里面有 n 个 thread 去并行处理不同的 task (其实 task 串行处理就好了)。
4780 次点击
所在节点    Python
22 条回复
quietin
2016-01-08 15:26:41 +08:00
apscheduler ,第 4 点自己实现就行了,其它都可以实现
hick
2016-01-08 15:29:46 +08:00
@quietin 初步了解了看概念不错, 官方文档好像没说, 不过说没有 daemon , 所以应该是不支持多机的集中管理?
tywtyw2002
2016-01-08 15:30:18 +08:00
@quietin 能不能简单说说第四点怎么实现呢?
baocaixiong
2016-01-08 15:30:58 +08:00
celery.schedule
knightdf
2016-01-08 15:31:48 +08:00
supervisor ,想控制直接自己再程序里控制
quietin
2016-01-08 15:47:21 +08:00
@tywtyw2002 直接 try except 可以吧?函数递归,或者用另外一个函数来调用也可以。
比如 task 用 work 函数执行, 在函数 run 中跑 work -> A exception -> except -> X + work
把 task 加入到 apscheduler 的调度中即可
quietin
2016-01-08 15:47:55 +08:00
@tywtyw2002 手误,是把 run 函数加入到 apscheduler 的调度中
ethego
2016-01-08 15:51:37 +08:00
quietin
2016-01-08 15:51:44 +08:00
tywtyw2002
2016-01-08 15:55:25 +08:00
@quietin 之前我是这么想的,但是后来发现一个问题就是 X 有 30%的时候非一次成功,有时候需要等待 30+分钟并且进行多次才可以。

所以把他加入 run 里面并不是一个很好的解决办法。
比较好的解决办法就是把 X 当做一个新的 task 去调度,并且暂停原来的 task ,知道 X 执行成功。

apscheduler 简单看了一下,没找到关于动态调度的信息。
quietin
2016-01-08 16:00:48 +08:00
@tywtyw2002 同步阻塞, X 成功前 run 就卡在那儿了,不满足么
Rand01ph
2016-01-08 16:18:19 +08:00
celery 应该可以满足
est
2016-01-08 16:20:04 +08:00
redis queue
tuteng
2016-01-08 17:01:37 +08:00
celery
robinlovemaggie
2016-01-08 17:06:29 +08:00
看楼主的意思是觉得 celery+redis 太复杂是吗?试试 huey+redis ,轻巧许多——
https://huey.readthedocs.org/en/latest
loading
2016-01-08 17:08:01 +08:00
这个有时间研究一下,目前我还是操作系统完成的。
langyu
2016-01-08 18:31:38 +08:00
celery beat
junzki
2016-01-08 23:44:07 +08:00
同 APScheduler ,基本能达到要求。至于 Daemonize ,可选方案比较多。 Python Cookbook 中给出了在 *nix 系统中 Daemonize 的实现方案,抄下来就可以用; 也可以使用 Linux 自带的 daemonize 来实现,不过可能需要自己写一点 shell 。
tywtyw2002
2016-01-09 04:10:02 +08:00
@quietin 但是这样阻塞了其他 task ,不同 task 是独立的。
tywtyw2002
2016-01-09 04:13:46 +08:00
@robinlovemaggie 不想配置 redis 呗。 觉得这简单的 job 一个 py 文件解决了。而且 task 数量就几个,主要是循环运行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/249305

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX