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
相关产品推荐
相关产品推荐

