Python队列consum

2024-06-16 09:59:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,开始学习一些高级概念。这里我使用python队列来消费和生产线程。这是线程安全的吗?在这里,我向队列添加列表项,并在使用者线程中检索它。有什么最好的办法吗?在

from queue import Queue
import threading
import time

class producer(threading.Thread):

    def __init__(self, list_of_numbers):
        threading.Thread.__init__(self)
        self.list_items = list_of_numbers

    def run(self):
        for i in self.list_items:
            queue.put(str(i))

class consumer(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        while queue.not_empty:
            queue_ret = queue.get()
            print("Retrieved", queue_ret)


queue = Queue()
producers = producer([10,20,5,4,3,2,1])
consumers = consumer()

producers.start()
consumers.start()
producers.join()
consumers.join()

Tags: producerimportself队列queueinitdef线程
3条回答

文档明确声明队列是线程安全的:

The Queue module implements multi-producer, multi-consumer queues. It is especially useful in threaded programming when information must be exchanged safely between multiple threads.

https://docs.python.org/2/library/queue.html

要完成使用者线程,可以将sentinel值推送到队列中,如下所示:

from queue import Queue
import threading
import time

class producer(threading.Thread):

    def __init__(self, list_of_numbers):
        threading.Thread.__init__(self)
        self.list_items = list_of_numbers

    def run(self):
        for i in self.list_items:
            queue.put(str(i))
        print("Producer Finished")

class consumer(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        done = False
        while not done:
            queue_ret = queue.get()
            if queue_ret is None:
                done = True
            else:
                print("Retrieved", queue_ret)
            queue.task_done()
        print("Consumer Finished")


queue = Queue()
producers = [producer([10,20,5,4,3,2,1])]
consumers = [consumer()]

for producer in producers:
    producer.start()

for consumer in consumers:
    consumer.start()

for producer in producers:
    producer.join()

for consumer in consumers:
    queue.put(None)

for consumer in consumers:
    consumer.join()

print("Finished")

首先用队列初始化消费者类。在

然后加上queue.task\u完成()位于使用者线程类的末尾。这将告诉线程以后忽略该队列项队列.get()电话。最终,这意味着您的队列将“清空”,线程将完成其工作。在

class consumer(threading.Thread):

  def __init__(self, queue):
      threading.Thread.__init__(self)
      self.queue = queue

  def run(self):
      while queue.not_empty:
          queue_ret = self.queue.get()
          print("Retrieved", queue_ret)
          self.queue.task_done()

# to start your threads, for example 5 threads
for i in range(5):
    consumers = consumer(queue)
    consumers.start()

相关问题 更多 >