队列和集Python之间的区别

cha*_*s M 3 python queue multithreading set

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

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)
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*ler 5

Queues维护可能非独特元素的排序.Sets另一方面,不保持订购,可能不包含重复.

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

如上所述@mata,queue如果多个线程正在生成和消耗它们,则应该使用a .Queues实现与生产者/消费者一起工作所需的阻止功能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
Run Code Online (Sandbox Code Playgroud)

get在消费者线程(即worker)中阻塞,直到queue获取内容join中的某些内容,在生成器线程中阻塞,直到它放入的每个项目queue被消耗,并且task_done在消费者线程中告诉队列它获取的项目已被消耗.

  • 这只是一个原因,更令人信服的是队列的同步功能,阻止访问,限制大小的可能性等等...... (2认同)