首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >队列和集合Python的区别

队列和集合Python的区别
EN

Stack Overflow用户
提问于 2016-08-31 19:30:56
回答 1查看 870关注 0票数 3

如果存在多线程,则一个函数将一个值添加到列表中,而另一个函数将获取该值。不同之处在于:

代码语言:javascript
复制
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行的队列模块,这也给了他们过滤重复项的优势。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-31 19:38:57

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

在您的情况下,您可能需要记录每一个被刮掉的东西和/或它被刮掉的相对顺序。在这种情况下,请使用queues。如果您只想要抓取的独特内容的列表,而不关心抓取它们的相对顺序,那么可以使用sets

正如@mata所指出的,如果多个线程正在对queue进行生产和消费,则应该使用该and。Queues实现与生产者/消费者threads一起工作所需的阻塞功能。Queues是线程安全的,而sets不是。

在文档中的这个示例中:

代码语言:javascript
复制
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会告诉队列它所获取的项目已经被消费了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39248452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档