查看: 1892|回复: 0

[Android教程] 使用gevent spawn_later实现定时计划任务系统

发表于 2017-1-3 16:24:44
句号论坛
前段时间用有优先级和线程池做了可控的计划任务模块。正好今还在看gevent wsgi的东西,在想用gevent能不能实现计划任务系统。 看了下gevent开发http://www.maiziedu.com/course/747/文档,发现他没有现成那样的timer功能,但是有个spawn_later的功能。 spawn_later函数可接收周期时间及运行函数。
  简单说,用gevent.spawn_later就可以实现crontab的效果…..
   Python
  #coding:utf-8import geventimport gevent.monkey
  gevent.monkey.patch_all()
  INTERVAL = 10
  def schedule(delay, func, *args, **kw_args):
  gevent.spawn_later(0, func, *args, **kw_args)
  gevent.spawn_later(delay, schedule, delay, func, *args, **kw_args)
  def test1():
  print "func test1"
  def test2():
  print "func test2"
  def test3():
  print "test3"
  schedule(1,test1)
  schedule(2,test2)
  schedule(3,test3)
  while 1:
  gevent.sleep(1)
  GeventCron
  原理:
  gevent cron是一个利用gevent开发的定时任务系统,模块不大,五藏俱全,还支持动态的添加任务和关闭任务.
  他的缺点就是,太依赖gevent的调度了,所以如果你逻辑里面采用的是堵塞模块,那么定时任务的执行时间都要乱掉…..所以尽量让你业务逻辑,采用gevent patch过的模块。比如subprocess,换成gevent subprocess .
  使用方法:
  Python
  <pre class="prettyprint lang-py">#coding:utf-8import geventcron
  from datetime import datetimeimport timeimport osimport requests
  def func_1():
  time.sleep(2)
  def func_2():
  time.sleep(2)
  def func_3():
  time.sleep(2)
  if __name__ == "__main__":
  scheduler = geventcron.Scheduler(logger_name='task_scheduler')
  scheduler.schedule('task_1', geventsheduler.every_second(4), func_1)
  scheduler.schedule('task_2', geventsheduler.every_second(1), func_2)
  scheduler.schedule('task_3', geventsheduler.every_second(1), func_3)
  scheduler.run_forever(start_at='once')
  主要的事情说三遍,不要用让gevent阻塞的模块,不要用堵塞的模块,不要用堵塞的模块… O(∩_∩)O~
来源:峰云就她了



太阳http代理AD
回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条