0

我使用 Python SleekXMPP 库制作了一个Farkle Jabber 游戏机器人。在多人游戏模式中,用户轮流与用户对战。我正在尝试设置暂停时间,例如,如果您的对手在 1 分钟内没有回应,您就赢了。

这是我尝试过的:

import sleekxmpp
...
time_received={}
class FarkleBot(sleekxmpp.ClientXMPP):
    ...
    def timeout(self, msg, opp):                  
        while True:
            if time.time() - time_received[opp] >= 60:
               print "Timeout!"
               #stuff
               break
    def messages(self, msg):
        global time_received
        time_received[user] = time.time()
        ...
        if msg['body'].split()[0] == 'duel':
            opp=msg['body'].split()[1]  #the opponent
            ...   #do stuff and send "Let's duel!" to the opponent.
            checktime=threading.Thread(target=self.timeout(self, msg, opp))
            checktime.start()

上面代码的问题是它会冻结整个班级,直到 1 分钟过去。我怎样才能避免这种情况?我尝试将timeout功能放在课堂之外,但没有任何改变。

4

1 回答 1

1

如果您必须等待某事,最好使用 time.sleep() 而不是忙着等待。你应该像这样重写你的超时:

def timeout(self, msg, opp, turn):
    time.sleep(60)
    if not turn_is_already_done:
        print "Timeout"

如您所见,您必须以某种方式跟踪是否已按时收到移动。

因此,更简单的解决方案可能是使用threading.Timer. 然后,您必须设置一个处理程序来处理超时。例如

def messages(self, msg):
    timer = threading.Timer(60, self.handle_timeout)
    # do other stuff
    # if a move is received in time you can cancel the alarm using:
    timer.cancel()

def handle_timeout(self):
    print "you lose"
于 2012-09-15T16:55:11.057 回答