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

Python多线程下input()与print()无法并行执行问题求解

问题核心原因

你的代码两个函数无法并发运行和打印锁、多进程/多线程选型无关,是线程创建的写法完全错误:

  • 给threading.Thread的target参数传值时,你写的是target=control_func()、target=print_data(t_start)——这里加了括号代表在主线程中立刻同步执行对应函数,根本不会把函数交给子线程调度。因为两个函数都是死循环,所以先执行哪个就会一直卡在哪一个里,另一个函数永远没机会运行。
  • 代码还缺失必要的模块导入,time、sys都没有引入,原样运行会直接抛出名称错误。
  • 数据读取循环没有加时间间隔,会无限制占满CPU刷输出,不符合你“每秒读取一次”的需求。
修正后可直接运行的代码
import time
import sys
import threading
from threading import Lock
import device  # 保留你自己的设备模块导入

# 线程安全打印,避免控制台输出错乱
s_print_lock = Lock()
def s_print(*a, **b):
    """线程安全打印函数"""
    with s_print_lock:
        print(*a, **b)

def print_data(t_start):
    while True:
        data = getData()  # 替换为你实际的读取数据逻辑
        s_print(f'data: {data} at time {time.time()-t_start}')
        time.sleep(1)  # 控制每秒读取一次,避免占满CPU

def control_func(dev):
    while True:
        in_ = input('Press ENTER to switch ON, Press x to quit')
        if in_ == '':
            dev.on()
            s_print('device ON')
        elif in_.lower() == 'x':
            dev.off()
            s_print('Exit program')
            sys.exit()
        else:
            continue

        in_ = input('Press ENTER to switch OFF, Press x to quit')
        if in_ == '':
            dev.off()
            s_print('device OFF')
        elif in_.lower() == 'x':
            dev.off()
            s_print('Exit program')
            sys.exit()
        else:
            continue

if __name__ == "__main__":
    t_start = time.time()
    dev = device.device()  # 实例化设备对象,修改变量名避免和模块名重名冲突

    # 注意:target只传函数对象,不要加括号,参数通过args传入
    trd1 = threading.Thread(target=control_func, args=(dev,), daemon=True)
    trd2 = threading.Thread(target=print_data, args=(t_start,), daemon=True)

    trd1.start()
    trd2.start()

    trd1.join()
    trd2.join()
关键注意点
  • 给Thread传执行函数时,target接收的是函数对象本身,绝对不能加括号调用;函数需要的参数统一通过args(位置参数,元组类型)、kwargs(关键字参数,字典类型)传入。
  • 给子线程设置daemon=True后,主线程退出时会自动强制结束这两个跑死循环的子线程,不需要额外写线程退出逻辑,适合小型工具脚本场景。
  • 你之前尝试多进程也遇到同样问题,本质也是创建进程时同样错误地调用了函数,而不是把函数对象传给target参数。
  • Windows系统下控制台的input()阻塞在子线程中不会影响其他线程的输出,不需要额外做控制台输入输出的兼容处理,保留线程安全打印即可避免多线程同时写控制台导致的行内容错乱。

内容的提问来源于stack exchange,提问作者Stephan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:57:25