我使用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
功能放在课外,但没有任何改变。
答案 0 :(得分:1)
如果你必须等待某事,最好使用time.sleep()而不是忙等待。你应该像这样重写你的超时:
def timeout(self, msg, opp, turn):
time.sleep(60)
if not turn_is_already_done:
print "Timeout"
如您所见,您必须以某种方式跟踪是否已按时收到移动。
因此,更简单的解决方案可能是使用threading.Timer
设置闹钟。然后,您必须设置处理程序以处理超时。 E.g。
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"