Twisted 任务调度派遣之 scheduling:定时执行程序

本文以简单易懂的语言来记录关于twisted定时执行某个任务的方法:

1. 如果要让某个程序在 x 秒之后执行,可以用 reactor.callLater() 方法:

# reactor.callLater() 在x秒之后启动f()函数
def f(s):
    print("this will run 2 seconds after it was scheduled: %s" % s)

reactor.callLater(2, f, "hello, world")
reactor.run()

2. 如果要接收程序的返回结果和处理异常,可以用 twisted.internet.task.deferLater(clock, delay, *args, callable=None, **kw)

def f(s):
    input("inputstr:")
    return "This will run 3.5 seconds after it was scheduled: %s" % s

# twisted.internet.task.deferLater(clock, delay, *args, callable=None, **kw)
d = task.deferLater(reactor, 2, f, "hello, world")  # 2秒之后触发f()

def call1(pos1):
    print(pos1)

d.addCallback(call1)   # 加入 call1() 处理函数,等f()延迟结束,会把f()返回的结果通过参数传给call1()
# 打印: This will run 3.5 seconds after it was scheduled: hello, world

def call2(pos1):
    print(pos1)
d.addCallback(call1)   # 加入 call2()处理函数,等 call1()延迟结束,会把 call1()返回的结果通过参数传给call2(),由于call1()没有返回值,所以这里是打印None

def errcalled(err):
    print(err)
d.addErrback(errcalled)  # 添加异常处理函数


reactor.run()

3. 如果要让一个循环每隔 x 秒重复一次,可以使用 twisted.internet.task.LoopingCall()

loopTimes = 3
failInTheEnd = False
_loopCounter = 0

def runEverySecond():   # Called at ever loop interval
    global _loopCounter

    if _loopCounter < loopTimes:
        _loopCounter += 1
        print('A new second has passed.')
        return

    if failInTheEnd:
        raise Exception('Failure during loop execution.')

    # We looped enough times.
    loop.stop()
    return


def cbLoopDone(result):     # Called when loop was stopped with success.
    print("Loop done.")
    reactor.stop()


def ebLoopFailed(failure):      # Called when loop execution failed.

    print(failure.getBriefTraceback())
    reactor.stop()


loop = task.LoopingCall(runEverySecond)

# Start looping every 1 second.
loopDeferred = loop.start(1.0)

# Add callbacks for stop and failure.
loopDeferred.addCallback(cbLoopDone)
loopDeferred.addErrback(ebLoopFailed)

reactor.run()

 

本文参考文章:

Scheduling tasks for the future

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值