队列和集Python之间的区别

时间:2016-08-31 11:30:56

标签: python multithreading set queue

如果存在多线程和一个向列表添加值的函数以及另一个获取该值的函数。与之不同的是:

import queue
scrape = queue.Queue()
def scrape():
    scrape.put('example')
def send():
    example = scrape.get()
    print (example)

scrape = set([])
def scrape():
    scrape.add('example')
def send():
    example = scrape.pop()
    print (example)

为什么人们使用170-180行的队列模块,如果条件减慢了这种情况的过程,如果他们可以使用集合,这也会给他们带来重复过滤的优势。

1 个答案:

答案 0 :(得分:5)

Queues维护可能非唯一元素的排序。另一方面,Sets不保持排序,也可能不包含重复项。

在您的情况下,您可能需要记录每件被刮的东西和/或刮擦的相对顺序。在这种情况下,请使用queues。如果您只想要列出您所抓取的独特内容,并且不必关心抓取它们的相对顺序,请使用sets

@mata所指出的,如果多个线程正在生成和消费它,则应使用queueQueues实现了与生产者/消费者threads一起使用所需的阻止功能。 Queues是线程安全的,sets不是。

在这个例子中来自docs:

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()   # block until all tasks are done
消费者线程中的

get(即worker)阻塞,直到queue中有一些东西得到,生成器线程中的join阻塞,直到每个项目为止消耗掉了queue,消费者线程中的task_done告诉队列它已经消耗了它所获得的项目。