【问题标题】:Difference between Queue and Sets Python队列和集合 Python 的区别
【发布时间】:2016-08-31 11:30:55
【问题描述】:

如果存在多线程和一个向列表添加值的函数和另一个获取该值的函数。有什么区别:

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 行的队列模块,如果条件会减慢这种情况的处理速度,如果他们可以使用集合,这也给了他们重复过滤的优势。

【问题讨论】:

    标签: python multithreading set queue


    【解决方案1】:

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

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

    正如@mata 指出的那样,如果多个线程正在生产和消费它,则应该使用queueQueues 实现与生产者/消费者 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
    

    消费者线程中的get(即worker)阻塞,直到queue中有东西要获取,生产者线程中的join阻塞,直到它放入queue的每个项目都被消耗, 和 task_done 在消费者线程中告诉队列它得到的项目已经被消费了。

    【讨论】:

    • 这只是一个原因,更引人注目的是队列的同步功能、阻塞访问、限制大小的可能性等等......
    • 阻止访问是什么意思?检查队列是否为空?我只是在 while true 循环中使用 try 和 except 。
    • get,默认情况下会阻塞,直到有东西被放入队列并且可以获取。比引发异常以指示 queue 为空更 Pythonic。
    • 如果你查看 get 定义里面有一个 try 语句。还有很多 if 和 else 语句。
    • 嗯,感谢您和 Stackoverflow 每次都为我指明正确的方向。
    猜你喜欢
    • 2012-09-03
    • 2014-05-07
    • 2011-11-10
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多