计算机里的约瑟芬 2023-06-08 22:03 采纳率: 75%
浏览 14

python并发程序出现问题


import threading
import queue
import time

num=0
# 定义函数f1
def f1(qin,qout,lock):
    i=True
    x=None
    if qin.qsize()!=0:
        lock.acquire()
        x = qin.get()
        lock.release()
        time.sleep(0.18)  # 模拟耗时操作
    if not x and (not qout.full()):
        lock.acquire()
        qout.put(x)  # 处理输入并将结果放到输出队列中
        lock.release()

# 定义线程s1
def s1(qin,lock):
    global num
    while True:
        num = num+1  # 随机产生一个x
        if not qin.full():
            lock.acquire()  # 获取锁
            qin.put(num)  # 将x放入输入队列
            lock.release()  # 释放锁
        time.sleep(0.04)  # 模拟循环耗时

# 定义线程s2
def s2(qout,lock):
    while True:
        if qout.qsize()!=0:  # 如果输出队列不为空
            lock.acquire()  # 获取锁
            x = qout.get()  # 从输出队列中获取结果
            lock.release()  # 释放锁
            print(x)  # 打印结果
        time.sleep(0.04)  # 模拟循环耗时

# 创建共享队列和锁
qin = queue.Queue(maxsize=8)
qout = queue.Queue(maxsize=8)
lock = threading.Lock()

# 创建线程f1,s1和s2
t1 = threading.Thread(target=s1, args=(qin,lock))
t2 = threading.Thread(target=s2, args=(qout,lock))
tf1 = threading.Thread(target=f1, args=(qin,qout,lock))
tf2 = threading.Thread(target=f1, args=(qin,qout, lock))
tf3 = threading.Thread(target=f1, args=(qin,qout, lock))
tf4 = threading.Thread(target=f1, args=(qin,qout, lock))
tf5 = threading.Thread(target=f1, args=(qin,qout, lock))



# 启动线程f1,s1和s2
t1.start()
t2.start()
tf1.start()
tf2.start()
tf3.start()
tf4.start()
tf5.start()

求问,这个代码哪里需要可以修改的,卡住了

  • 写回答

1条回答 默认 最新

  • 於黾 2023-06-09 09:05
    关注

    if not x and (not qout.full()):
    这啥逻辑,如果x是个None就把x塞进out队列里,x取到值反而丢弃了
    写一个复杂的逻辑的时候,你要先从简单的逻辑开始调试
    不要一股脑一起运行

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月8日

悬赏问题

  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22