4

在 Tornado 中不是很有经验,如果这听起来像一个新手问题,很抱歉。

我正在使用标准 html/js 代码和服务器上的龙卷风与客户端构建纸牌游戏。一切正常,但是我需要在服务器上实现倒计时,在一定时间后运行特定代码。我正在使用以下 python 代码并在发出请求后从龙卷风中调用它

import time

class StartTimer(object):

    timerSeconds = 0

    def __init__(self):

        print "start timer initiated"
    def initiateTime(self, countDownSeconds):
        self.timerSeconds = countDownSeconds

        while self.timerSeconds >= 0:
            time.sleep(1)
            print self.timerSeconds
            self.timerSeconds -=1

            if self.timerSeconds == 0:
                #countdown finishes
                print "timer finished run the code"


    def getTimer(self):

        return self.timerSeconds

倒计时工作正常但是我首先有两个问题,而计时器正在倒计时服务器阻止任何其他连接并将它们放入队列并在计时器完成后运行代码其次,我需要 getTimer 函数来工作所以一个新的进来的客户知道还剩多少时间(基本上是获取 timerSeconds 值)。我可以避免计时器不向用户显示,但是代码被阻止的事实绝对不好。

请帮忙

4

2 回答 2

5

time.sleep()将阻止,add_timeout()改用检查这里

编辑:抱歉,@Armin Rigo 已回答

这是一个例子

import time
import tornado.ioloop


def delayed_print(s):
    if len(s) == 0:
        ioloop.stop()
    else:
        print s[0]
        ioloop.add_timeout(time.time() + 1, lambda:delayed_print(s[1:]))

ioloop = tornado.ioloop.IOLoop()
delayed_print('hello world')
ioloop.start()
于 2013-04-06T18:56:08.120 回答
1

IOLoop.call_later从 Tornado 4.0 开始会更方便。对于相对情况,因为它不需要 timedelta 对象。

于 2015-04-21T07:56:37.683 回答