V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yueyoum
V2EX  ›  程序员

定时器 推荐,或者实现

  •  
  •   yueyoum ·
    yueyoum · 2013-12-11 17:05:49 +08:00 · 5525 次点击
    这是一个创建于 4000 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有大量的定时任务, 在任务生成的时候 注册到定时器里,

    当时间到了 定时器就给予通知。

    比如 把 callback 函数,和 5 作为参数注册,
    当5秒过后 定时器触发 callback 函数。

    要求 能大量并发的添加任务,取消任务,持久化,崩溃恢复。


    感觉 定时器 应该是一个常见的需求,但貌似没找到现成的。

    求推荐。
    14 条回复    1970-01-01 08:00:00 +08:00
    shiny
        1
    shiny  
       2013-12-11 17:21:01 +08:00
    用支持延时的队列即可?比如 beanstalkd ?
    ipconfiger
        2
    ipconfiger  
       2013-12-11 17:32:48 +08:00   ❤️ 1
    tornado IOLoop
    cute
        3
    cute  
       2013-12-11 18:14:11 +08:00
    python celery beat
    yueyoum
        4
    yueyoum  
    OP
       2013-12-11 18:28:41 +08:00
    @shiny

    还不知道 beanstalkd 去了解下
    yueyoum
        5
    yueyoum  
    OP
       2013-12-11 18:32:27 +08:00
    @ipconfiger

    能具体点吗?

    是不是这种思路 我用erlang 来说
    timer 每收到一个请求 就 spawn 一个 process, sleep 住,
    等时间到了 再做对应的动作

    但要自己实现……

    有点懒 看是否有现成的
    yueyoum
        6
    yueyoum  
    OP
       2013-12-11 18:37:28 +08:00
    @cute

    celery 我试了下, 可能是我不会用 在默认 prefork workers 模式 是不能满足要求的

    当添加一个定时任务的时候,一个worker就sleep住,
    这样就需要大量的worker process 这样显然是不可取的。


    我还没研究 greenlet, eventloop 类型的worker
    ipconfiger
        7
    ipconfiger  
       2013-12-11 20:28:44 +08:00
    @yueyoum 是这样子的,tornado的IOLoop本质上就是个大死循环,所以,IOLoop.add_timeout 能够解决你的问题
    bengol
        8
    bengol  
       2013-12-11 21:05:32 +08:00
    原来你们在讨论语言的基础设施
    cute
        9
    cute  
       2013-12-11 21:20:59 +08:00
    @yueyoum

    celery的beat是配合worker的,时间到了beat发送消息给worker执行。
    cute
        10
    cute  
       2013-12-11 21:22:28 +08:00
    @yueyoum
    celery的beat是配合worker的,时间到了beat发送消息给消息服务器,然后worker获取任务执行执行。
    pythoner
        11
    pythoner  
       2013-12-11 21:29:12 +08:00
    celery满足你的需要.

    your_task.apply_async(eta=now + timedelta(seconds=5))
    mumhero
        12
    mumhero  
       2013-12-11 22:32:31 +08:00
    http://pythonhosted.org/APScheduler/
    看看这个性能满足你的要求不
    yueyoum
        13
    yueyoum  
    OP
       2013-12-12 00:24:57 +08:00
    @pythoner

    恩, 这个应该就是我需要的,我当时在worker的函数中写了 time.sleep

    后来发现 一个worker 要sleep完毕后 才能接受新的任务,

    写成 apply_async(countdown=5) 就可以了。

    看文档 countdown 和 eta 能达到同样的效果。
    yueyoum
        14
    yueyoum  
    OP
       2013-12-12 00:26:54 +08:00
    @mumhero

    现在就是用 这个来做的, 功能还在开发中。

    预计到 在程序运行时,可能会并发产生 10w+ (应该不会超过100w) 的定时任务,
    感觉 apschuduler 线程的处理方式可能 有些问题。

    我也没测试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:30 · PVG 12:30 · LAX 20:30 · JFK 23:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.