You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何同时运行两个函数?现有代码阻塞问题求助

问题解决:让计时器与游戏逻辑同时运行

你的代码现在的问题是单线程阻塞加上变量作用域错误,导致调用timer()后程序卡住,无法继续执行游戏逻辑。下面是具体的问题分析和修复方案:

问题分析

  1. 单线程阻塞:Python默认是单线程执行,当round1()调用timer()后,主线程会进入timer()的while循环,一直执行sleep和累加操作,根本不会往下走执行input(),所以程序看起来“卡住”了。
  2. 变量作用域错误:timer()里的correct是局部变量,round1()里的correct = 2修改的是另一个局部变量,根本影响不到timer()里的循环条件,就算后续能执行到这一步,timer()的循环也永远不会停止。
  3. 类型不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:25:25