定时器 推荐,或者实现 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
yueyoum

定时器 推荐,或者实现

  •  
  •   yueyoum
    yueyoum Dec 11, 2013 6266 views
    This topic created in 4539 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     3064 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 02:54 PVG 10:54 LAX 19:54 JFK 22:54
    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