• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yueyoum
V2EX  ›  程序员

定时器 推荐,或者实现

  •  
  •   yueyoum ·
    yueyoum · Dec 11, 2013 · 6257 views
    This topic created in 4536 days ago, the information mentioned may be changed or developed.
    有大量的定时任务, 在任务生成的时候 注册到定时器里,

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

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

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


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

    求推荐。
    14 replies    1970-01-01 08:00:00 +08:00
    shiny
        1
    shiny  
    PRO
       Dec 11, 2013
    用支持延时的队列即可?比如 beanstalkd ?
    ipconfiger
        2
    ipconfiger  
       Dec 11, 2013   ❤️ 1
    tornado IOLoop
    cute
        3
    cute  
       Dec 11, 2013
    python celery beat
    yueyoum
        4
    yueyoum  
    OP
       Dec 11, 2013
    @shiny

    还不知道 beanstalkd 去了解下
    yueyoum
        5
    yueyoum  
    OP
       Dec 11, 2013
    @ipconfiger

    能具体点吗?

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

    但要自己实现……

    有点懒 看是否有现成的
    yueyoum
        6
    yueyoum  
    OP
       Dec 11, 2013
    @cute

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

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


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

    celery的beat是配合worker的,时间到了beat发送消息给worker执行。
    cute
        10
    cute  
       Dec 11, 2013
    @yueyoum
    celery的beat是配合worker的,时间到了beat发送消息给消息服务器,然后worker获取任务执行执行。
    pythoner
        11
    pythoner  
       Dec 11, 2013
    celery满足你的需要.

    your_task.apply_async(eta=now + timedelta(seconds=5))
    mumhero
        12
    mumhero  
       Dec 11, 2013
    http://pythonhosted.org/APScheduler/
    看看这个性能满足你的要求不
    yueyoum
        13
    yueyoum  
    OP
       Dec 12, 2013
    @pythoner

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

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

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

    看文档 countdown 和 eta 能达到同样的效果。
    yueyoum
        14
    yueyoum  
    OP
       Dec 12, 2013
    @mumhero

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

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

    我也没测试。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5536 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 08:22 · PVG 16:22 · LAX 01:22 · JFK 04:22
    ♥ Do have faith in what you're doing.