• asia~wz[]niubilit...
    2018-10-30
    消费者的task_done()还是不清楚用来干什么

    作者回复: task_done()是配合join()使用的,join() 会让队列一直处于阻塞状态,直到queue里面所有的message都被get()取出来调用了task_done()才能返回,不用这个函数会让join()出现无限挂起的问题,不符合我们写程序的预期。
            它和join()一起使用来判断队列里是否还有message需要处理的一种机制,如果看它的代码实现,会发现它通过信号与join()进行配合的。
            或许在初学阶段,大家更容易理解这种用法
    while not workQueue.empty():
        pass
    就是一直循环,直到队列为空。
            两种机制都可以判断为队列是否为空,看你需要那种方法和想要在哪种场景下使用。

    
     4
  • littlePerfect
    2019-01-17
    老师, queue 为什么要设置成全局变量?

    作者回复: 在文件内,模块(函数)外声明的都是全局变量,
    这里使用的global是声明在类中使用的queue是全局变量,避免class内部误声明同名的queue变量发生冲突。

     1
     3
  • 一直都在
    2019-01-28
    老师,我的代码不知道出什么问题了,生产者一直在生产数据,消费者没有进行消费
    from threading import Thread, current_thread
    import random
    import time
    from queue import Queue

    queue = Queue(5)


    class ProducerThread(Thread):
        def run(self):
            name = current_thread().getName()
            nums = range(100)
            global queue
            while True:
                num = random.choice(nums)
                print('生产者 %s 生产了数据 %s' % (name, num))
                t = random.randint(1, 3)
                time.sleep(t)
                print('生产者 %s 休眠了 %s 秒' % (name, t))


    class ConsumerThread(Thread):
        def run(self):
            name = current_thread().getName()
            global queue
            while True:
                num = queue.get()
                queue.task_done()
                print('消费者 %s 消耗了数据 %s' % (name, num))
                t = random.randint(1, 5)
                time.sleep(t)
                print('消费者 %s 休眠了 %s 秒' % (name, t))


    p1 = ProducerThread(name='p1')
    p1.start()
    c1 = ConsumerThread(name='c1')
    c1.start()
    展开

    作者回复: 问题出在产生了一个数据,但是并没有将他放在队列里面(queue.put(num))啊,当第二个线程执行到num = queue.get()时会“暂停”,直到有数据写入队列,所以你只看到打印生产数据,没看到消费数据

    
     2
  • 海生
    2018-08-05
    这个还得对队列读写时队列的空满做判断吧?

    作者回复: 一定要判断的,我这里没有演示是因为queue包对已满队列有自己的处理机制,而不是抛出异常。可以自己尝试一下,如果只往队列写,不读取会发生什么结果?通过官方文档查看如何判断队列是否已满?

    
     2
  • inh556
    2019-02-09
    看到你给其他同学的留言,好像是说队列空位时,执行到num = queue.get()时会“暂停”。 为什么会暂停呢? 我们没有给它暂停的指令啊。是这个方法自带的功能吗?

    作者回复: 是的,这是引用了queue库时引入的,类似异常处理。

    
     1
  • 泡芙
    2019-08-25
    老师,为什么要使用task.done()方法来同步和等待呢?不进行同步和等待,这个例子里看着没有什么影响呀?

    作者回复: task_done()作用:如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞

    参考等待排队的任务被完成的示例:

    import queue
    import threading

    def worker():
        while True:
            item = q.get()
            if item is None:
                break
            print(item, 'run')
            #注释q.task_done()这行查看程序运行结果进行对比
            q.task_done()


    q = queue.Queue()
    threads = []
    num_worker_threads = 2

    for i in range(num_worker_threads):
        t = threading.Thread(target=worker)
        t.start()
        threads.append(t)

    for item in range(10):
        q.put(item)

    # block until all tasks are done
    q.join()

    # stop workers
    for i in range(num_worker_threads):
        q.put(None)
    for t in threads:
        t.join()

    
    
  • 我是,露莹
    2019-04-24
    老师,您好,关于queue变量为什么设置为global的问题,我看到您已经给出了解释。
    但是还是很难理解,可否举个具体一点的例子说明呢?
    
    
  • 爱学习
    2019-03-19
    ImportError: cannot import name 'Queue' from 'queue'
    老师,我在导入时报错,是版本问题吗?
    语句跟您的一样: from queue import Queue

    作者回复: 是否您的文件名就是 queue.py 呢?

    
    
  • MD
    2019-03-07
    p1 = ProducerThread(name='p1')这个有点不明白,前面的代码里面name= current_thread().getName() 表示name变量为当前线程名,实例中第一个参数就是线程名?为什么不适用__init__初始化name?

    作者回复: p1是ProducerThread()类的实例化,ProducerThread()继承了threading类,当我调用p1.start()方法时,class ProducerThread(Thread)类会自动调用run()方法。

    首先强调一下这段代码的目的性:这里我写ProducerThread(name='p1')目的是想使用 p1 c1 c2的名字替代 thread-1 、 thread-2、 thread-3 ...这样的默认名称,为的是输出时方便大家看效果。这个功能要在实例化的时候使用,所以不能用__init__ 初始化name

    python传参是可以传“关键字参数”的,这里使用的name='p1'并不是第一个参数是线程名,而是我在run()方法定义了name变量,实例化的时候重传name进行覆盖。

    
    
  • inh556
    2019-02-09
    老师,当队列为空的消费者去消费的时候发生了什么?
    为什么没有打印出来说消费为0?根据代码,消费者会一直去队列去查询是有有可用消费,但好像什么都没发生似的?自己没尝试出来。
    
    
  • littlePerfect
    2019-01-17
    老师, global 为什么会设置成全局变量?
     1
    
我们在线,来聊聊吧