Python中如何同时运行两个函数?现有代码阻塞问题求助
问题解决:让计时器与游戏逻辑同时运行
你的代码现在的问题是单线程阻塞加上变量作用域错误,导致调用timer()后程序卡住,无法继续执行游戏逻辑。下面是具体的问题分析和修复方案:
问题分析
- 单线程阻塞:Python默认是单线程执行,当
round1()调用timer()后,主线程会进入timer()的while循环,一直执行sleep和累加操作,根本不会往下走执行input(),所以程序看起来“卡住”了。 - 变量作用域错误:
timer()里的correct是局部变量,round1()里的correct = 2修改的是另一个局部变量,根本影响不到timer()里的循环条件,就算后续能执行到这一步,timer()的循环也永远不会停止。 - 类型不匹配:
input()返回的是字符串,而numb是整数,直接用ans == numb比较永远不会相等。
修复方案:使用多线程
我们可以用threading模块把计时器放到子线程中运行,这样主线程就能继续处理用户输入,同时用全局变量或者类来共享两个函数的状态。
方案1:全局变量实现
import time import random import threading # 全局变量共享状态 correct = 1 x = 0.0 def timer(): global correct, x while correct != 2: time.sleep(0.1) x += 0.1 def round1(): global correct, x numb = random.randint(1, 100) print(numb) # 启动计时器子线程 timer_thread = threading.Thread(target=timer) timer_thread.start() # 等待用户输入 ans = input(">") # 结束计时器循环 correct = 2 # 检查输入是否正确 if ans == str(numb): x_rounded = round(x) print(f"你用了{x_rounded}秒完成!") else: print("输入错误!") round1()
方案2:类封装(更推荐,避免全局变量)
import time import random import threading class NumberGame: def __init__(self): self.running = True self.elapsed_time = 0.0 def timer(self): while self.running: time.sleep(0.1) self.elapsed_time += 0.1 def start_round(self): numb = random.randint(1, 100) print(numb) # 启动计时器线程,daemon=True让主线程结束时子线程自动退出 threading.Thread(target=self.timer, daemon=True).start() # 获取用户输入 ans = input(">") # 停止计时器 self.running = False # 验证输入 if ans == str(numb): print(f"你用了{round(self.elapsed_time)}秒完成!") else: print("输入错误!") game = NumberGame() game.start_round()
修改说明
- 用
threading.Thread创建子线程运行计时器,主线程可以同时处理用户输入,不会被阻塞。 - 用全局变量或类属性共享状态,让主线程可以控制计时器的停止。
- 修正了字符串与整数的比较问题,把
numb转为字符串后再和输入值对比。 - 方案2中使用
daemon=True,避免主线程结束后残留未退出的子线程。
内容的提问来源于stack exchange,提问作者Nothaze
相关产品推荐
相关产品推荐

