python实现主线程接收参数控制子线程

代码说明:

  1. 队列通信:主线程和子线程通过 queue.Queue 进行通信,主线程将新的参数放入队列,子线程从队列中取出参数来调整其工作行为。
  2. 子线程行为:子线程根据主线程传递的参数调整行为:
    • "fast":子线程以 0.5 秒间隔快速工作。
    • "slow":子线程以 2 秒间隔慢速工作。
    • "normal":子线程以 1 秒间隔普通工作。
  3. 用户输入:主线程通过 input() 函数接收用户输入,用户可以输入参数来控制子线程的行为,也可以输入 "stop" 来停止子线程的工作。
  4. 动态调整:每当用户输入新参数,主线程将参数放入队列中,子线程检查队列并动态调整其工作方式。

运行步骤:

  1. 程序启动后,子线程会等待 3 秒钟,主线程发送开始信号后,子线程开始按照默认的 "normal" 模式工作。
  2. 用户可以在主线程中输入 "fast""slow""normal",这些输入将传递给子线程,子线程会相应地调整工作速度。
  3. 输入 "stop" 会触发子线程的停止事件,结束子线程的工作。
import threading
import time
import queue

# 创建事件对象和队列
start_event = threading.Event()
stop_event = threading.Event()
param_queue = queue.Queue()

# 子线程函数,接收主线程传递的参数
def worker():
    print("子线程等待开始信号...")
    start_event.wait()  # 等待主线程发出开始信号
    print("子线程开始工作...")

    current_param = "normal"  # 默认参数

    while not stop_event.is_set():  # 检查停止信号
        # 检查队列中是否有新的参数
        try:
            current_param = param_queue.get_nowait()  # 非阻塞获取参数
            print(f"子线程更新参数: {current_param}")
        except queue.Empty:
            pass  # 没有新参数则继续使用当前参数

        # 根据当前参数决定子线程行为
        if current_param == "fast":
            print("子线程快速工作...")
            time.sleep(0.5)  # 快速工作
        elif current_param == "slow":
            print("子线程慢速工作...")
            time.sleep(2)  # 慢速工作
        else:
            print("子线程普通工作...")
            time.sleep(1)  # 普通工作
    
    print("子线程停止工作...")

# 启动子线程
t = threading.Thread(target=worker)
t.start()

# 主线程等待 3 秒后发送开始信号
time.sleep(3)
print("主线程发送开始信号")
start_event.set()  # 触发开始信号

# 主线程循环接收用户输入,并将输入作为参数发送给子线程
while True:
    param = input("请输入子线程行为参数 (fast, slow, normal),输入 'stop' 停止子线程: ").strip()
    
    if param == "stop":
        print("主线程发送停止信号")
        stop_event.set()  # 触发停止信号
        break
    else:
        param_queue.put(param)  # 将新参数放入队列,子线程会获取
        print(f"主线程发送参数: {param}")

# 等待子线程结束
t.join()
print("子线程已结束")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值