2013-04-06 1 views
2

초보자 용 질문처럼 들리면 토네이도에 익숙하지 않으므로 유감스럽게 생각합니다.Python - 클라이언트가 서버에 연결하지 못하도록 차단하지 않고 Tornado에서 타이머를 실행할 수 없음

표준 html/js 코드와 토네이도를 사용하여 클라이언트와 카드 게임을 만들고 있습니다. 모든 것은 잘 작동하지만 특정 시간이 지나면 특정 코드가 실행되는 서버에서 카운트 다운을 구현해야합니다. 나는 다음 파이썬 코드를 사용하여 요청이 된 후에 토네이도에서 호출하고

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 값 가져 오기). 타이머가 사용자에게 보이지 않을 수도 있지만 코드가 차단되었다는 사실은 분명 좋지 않습니다.

+2

완전한 답변이 아닙니다. (죄송 합니다만, 토네이도를 모르지만) : http://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.Ioloop.add_timeout은 타이머 완료되었습니다. 'time.sleep()'는 전체 스레드를 1 초 동안 단순히 차단하기 때문에 코드가 작동하지 않습니다. –

답변

3

time.sleep() 차단, 사용 도와주세요 add_timeout() 대신 체크 here

편집 : 죄송합니다, 그것은

여기 an example입니다 @Armin 리고 응답되었습니다

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() 
+0

나는 이것을 행운으로 시험해 보았다. 어쩌면 그 이유는 무엇인지/그것을 포함시킬 곳이 확실하지 않기 때문에 타이머가 자동으로 작동하는 것이 아니라 클라이언트 작업의 결과로 시작해야합니다. 경우 __name__ == "__main__": tornado.options.parse_command_line() 응용 프로그램 = 응용 프로그램() 서버 = tornado.httpserver.HTTPServer (응용 프로그램) server.listen (옵션 나는이 같은 add_timeout 포함되어 있습니다. 포트) tornado.ioloop.IOLoop.instance(). start() tornado.ioloop.Ioloop (500, time.run())이게 맞습니까? 답변을 많이 주셔서 감사합니다 –

+0

여기에서보세요 https://groups.google.com/group/python-tornado/browse_thread/thread/363189360bea2dca –

+0

답변 해 주셔서 감사 드리며 지연에 대해 사과드립니다. 나는이 일을하기 위해 모든 것을 시도해 왔습니다. 그러나 백그라운드에서 작동하는 Python에서 스레딩을 시도했다. 타이머가 클라이언트에 도착했다는 메시지를 보낼 필요가있을 때 finish() 예외가 발생하면 응용 프로그램이 깨지기 때문에 write()를 쓸 수 없다. 방금 샘플을 시도했지만 작동하지만 서버를 완전히 차단하고 시작할 때가 아니라 응용 프로그램의 중간에 시작할 수있는 방법을 볼 수 없습니다. 나는 간단한 타이머를 만드는 것이이 많은 시간과 돈을 들게 할 것이라고는 생각하지 못했습니다. –

0

IOLoop.call_later이 더 편리합니다. nose 토네이도 4.0. timedelta 객체를 필요로하지 않기 때문에 상대적인 경우를 위해.