定时器 推荐,或者实现

2013-12-11 17:05:49 +08:00
 yueyoum
有大量的定时任务, 在任务生成的时候 注册到定时器里,

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

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

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


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

求推荐。
5515 次点击
所在节点    程序员
14 条回复
shiny
2013-12-11 17:21:01 +08:00
用支持延时的队列即可?比如 beanstalkd ?
ipconfiger
2013-12-11 17:32:48 +08:00
tornado IOLoop
cute
2013-12-11 18:14:11 +08:00
python celery beat
yueyoum
2013-12-11 18:28:41 +08:00
@shiny

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

能具体点吗?

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

但要自己实现……

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

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

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


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

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

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

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

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

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

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

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

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

我也没测试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/92733

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX