如果存在多线程,则一个函数将一个值添加到列表中,而另一个函数将获取该值。不同之处在于:
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)如果人们可以使用集合,那么为什么要使用具有if条件的170-180行的队列模块,这也给了他们过滤重复项的优势。
发布于 2016-08-31 19:38:57
Queues维护可能不唯一的元素的排序。另一方面,Sets不维护排序,并且不能包含重复项。
在您的情况下,您可能需要记录每一个被刮掉的东西和/或它被刮掉的相对顺序。在这种情况下,请使用queues。如果您只想要抓取的独特内容的列表,而不关心抓取它们的相对顺序,那么可以使用sets。
正如@mata所指出的,如果多个线程正在对queue进行生产和消费,则应该使用该and。Queues实现与生产者/消费者threads一起工作所需的阻塞功能。Queues是线程安全的,而sets不是。
在文档中的这个示例中:
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消费者线程(即worker)中的get会一直阻塞,直到queue中有东西要获取,生产者线程中的join会一直阻塞,直到它放入queue的每个项目都被消费了,消费者线程中的task_done会告诉队列它所获取的项目已经被消费了。
https://stackoverflow.com/questions/39248452
复制相似问题