线程无法强行终止,导致不能结束主进程

线程无法强行终止,导致不能结束主进程

如题

import threading
import time
import queue

# 创建队列
q = queue.Queue()


# 生产者
def Producer(name):
    for i in range(10):
        print(f'{name}制作了第{i+1}个小蛋糕\n', end='')
        time.sleep(0.1)
        q.put(i+1)


# 将制作的小蛋糕放入队列中


# 消耗者
def Consumer(name):
    while True:
        message = q.get()
        print(f'{name}吃了第{message}个蛋糕,但是没付钱\n', end='')
# 取出蛋糕并吃掉


if __name__ == '__main__':
    # 创建线程,一个生产者,三个消费者
    p = threading.Thread(target=Producer, args=('慕慕',))
    c1 = threading.Thread(target=Consumer, args=('小明',))
    c2 = threading.Thread(target=Consumer, args=('小红',))
    c3 = threading.Thread(target=Consumer, args=('安安',))
    for i in (p, c1, c2, c3):
        i.start()
    p.join()
    for i in (c1, c2, c3):
        print(i.is_alive())
        i.terminate() # 线程对象没有这个方法


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Mr朱_ 提问者 2023-05-28 10:31:43

接收端设置了超时退出,只是避免无线循环。

还是不能主动结束线程

代码:

# coding:utf-8

import threading
import time
import queue

# 创建队列
q = queue.Queue()


# 生产者
def Producer(name):
    for i in range(10):
        print(f'{name}制作了第{i + 1}个小蛋糕\n', end='')
        time.sleep(0.1)
        q.put(i + 1)


# 将制作的小蛋糕放入队列中


# 消耗者
def Consumer(name):
    while True:
        try:
            message = q.get(timeout=1)
            print(f'{name}吃了第{message}个蛋糕,但是没付钱\n', end='')
        except:
            break


# 取出蛋糕并吃掉


if __name__ == '__main__':
    # 创建线程,一个生产者,三个消费者
    p = threading.Thread(target=Producer, args=('慕慕',))
    c1 = threading.Thread(target=Consumer, args=('小明',))
    c2 = threading.Thread(target=Consumer, args=('小红',))
    c3 = threading.Thread(target=Consumer, args=('安安',))
    for i in (p, c1, c2, c3):
        i.start()
    for i in (p, c1, c2, c3):
        i.join()


  • 同学,你好!同学可以在while 循环中加个判断,如果队列为空则停止循环,代码如下图:

    https://img1.sycdn.imooc.com//climg/6474180809aa266710080348.jpg

    祝学习愉快~

    2023-05-29 11:12:30
  • 提问者 Mr朱_ 回复 好帮手慕小猿 #2

    我原来的代码已经有退出机制了,只是想问怎么在主进程中主动结束线程

    消息队列是每隔0.1秒生成的,直接  if q.empty()    不能得到想要的结果

    我改了一下代码

    def Consumer(name):
        while True:
            if q.empty():
                break
            message = q.get()
            print(f'{name}吃了第{message}个蛋糕,但是没付钱\n', end='')
    # 创建线程,一个生产者,三个消费者
    p = threading.Thread(target=Producer, args=('慕慕',))
    time.sleep(1)
    c1 = threading.Thread(target=Consumer, args=('小明',))
    c2 = threading.Thread(target=Consumer, args=('小红',))
    c3 = threading.Thread(target=Consumer, args=('安安',))

    代码有一个问题是不能模拟发送端发送消息,同时接收端接收消息的场景

    2023-05-30 09:15:13
  • 提问者 Mr朱_ 回复 好帮手慕小猿 #3


    抱歉,修改的代码贴错了

    def Consumer(name):
        while True:
            if q.empty():
                break
            message = q.get()
            print(f'{name}吃了第{message}个蛋糕,但是没付钱\n', end='')
            time.sleep(0.1)
    p.start()
    time.sleep(1)
    for i in (c1, c2, c3):
        i.start()
    for i in (p, c1, c2, c3):
        i.join()

    完整代码:

    # coding:utf-8
    
    import threading
    import time
    import queue
    
    # 创建队列
    q = queue.Queue()
    
    
    # 生产者
    def Producer(name):
        for i in range(10):
            print(f'{name}制作了第{i + 1}个小蛋糕\n', end='')
            time.sleep(0.1)
            q.put(i + 1)
    
    
    # 将制作的小蛋糕放入队列中
    
    
    # 消耗者
    def Consumer(name):
        while True:
            if q.empty():
                break
            message = q.get()
            print(f'{name}吃了第{message}个蛋糕,但是没付钱\n', end='')
            time.sleep(0.1)
    
    # 取出蛋糕并吃掉
    
    
    if __name__ == '__main__':
        # 创建线程,一个生产者,三个消费者
        p = threading.Thread(target=Producer, args=('慕慕',))
        c1 = threading.Thread(target=Consumer, args=('小明',))
        c2 = threading.Thread(target=Consumer, args=('小红',))
        c3 = threading.Thread(target=Consumer, args=('安安',))
        p.start()
        time.sleep(1)
        for i in (c1, c2, c3):
            i.start()
        for i in (p, c1, c2, c3):
            i.join()


    2023-05-30 09:20:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师