Python 有什么比较轻量的库可以提供 crontab 的功能并且带有 task queue 的功能呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tywtyw2002
V2EX    Python

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

  •  
  •   tywtyw2002 2016-01-08 15:06:28 +08:00 5280 次点击
    这是一个创建于 3643 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对于 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 串行处理就好了)。
    22 条回复    2016-01-09 19:22:36 +08:00
    quietin
        1
    quietin  
       2016-01-08 15:26:41 +08:00   2
    apscheduler ,第 4 点自己实现就行了,其它都可以实现
    hick
        2
    hick  
       2016-01-08 15:29:46 +08:00
    @quietin 初步了解了看概念不错, 官方文档好像没说, 不过说没有 daemon , 所以应该是不支持多机的集中管理?
    tywtyw2002
        3
    tywtyw2002  
    OP
       2016-01-08 15:30:18 +08:00
    @quietin 能不能简单说说第四点怎么实现呢?
    baocaixiong
        4
    baocaixiong  
       2016-01-08 15:30:58 +08:00
    celery.schedule
    knightdf
        5
    knightdf  
       2016-01-08 15:31:48 +08:00
    supervisor ,想控制直接自己再程序里控制
    quietin
        6
    quietin  
       2016-01-08 15:47:21 +08:00
    @tywtyw2002 直接 try except 可以吧?函数递归,或者用另外一个函数来调用也可以。
    比如 task 用 work 函数执行, 在函数 run 中跑 work -> A exception -> except -> X + work
    把 task 加入到 apscheduler 的调度中即可
    quietin
        7
    quietin  
       2016-01-08 15:47:55 +08:00
    @tywtyw2002 手误,是把 run 函数加入到 apscheduler 的调度中
    ethego
        8
    ethego  
       2016-01-08 15:51:37 +08:00
    quietin
        9
    quietin  
       2016-01-08 15:51:44 +08:00
    tywtyw2002
        10
    tywtyw2002  
    OP
       2016-01-08 15:55:25 +08:00
    @quietin 之前我是这么想的,但是后来发现一个问题就是 X 有 30%的时候非一次成功,有时候需要等待 30+分钟并且进行多次才可以。

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

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

    https://github.com/mqingyn/tornask
    nomaka
        22
    nomaka  
       2016-01-09 19:22:36 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5710 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 02:33 PVG 10:33 LAX 18:33 JFK 21:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86