如果存在多线程和一个向列表添加值的函数以及另一个获取该值的函数。与之不同的是:
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行的队列模块,如果条件减慢了这种情况的过程,如果他们可以使用集合,这也会给他们带来重复过滤的优势。
答案 0 :(得分:5)
Queues
维护可能非唯一元素的排序。另一方面,Sets
不保持排序,也可能不包含重复项。
在您的情况下,您可能需要记录每件被刮的东西和/或刮擦的相对顺序。在这种情况下,请使用queues
。如果您只想要列出您所抓取的独特内容,并且不必关心抓取它们的相对顺序,请使用sets
。
如@mata
所指出的,如果多个线程正在生成和消费它,则应使用queue
。 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
消费者线程中的 get
(即worker
)阻塞,直到queue
中有一些东西得到,生成器线程中的join
阻塞,直到每个项目为止消耗掉了queue
,消费者线程中的task_done
告诉队列它已经消耗了它所获得的项目。