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 · 4752 次点击
    这是一个创建于 3243 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对于 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   ·   实用小工具   ·   6001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:18 · PVG 10:18 · LAX 18:18 · JFK 21:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.