Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 队列和集合之间的区别_Python_Multithreading_Set_Queue - Fatal编程技术网

Python 队列和集合之间的区别

Python 队列和集合之间的区别,python,multithreading,set,queue,Python,Multithreading,Set,Queue,如果有多个线程,一个函数向列表中添加一个值,另一个函数接受该值。这两者的区别是什么: 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():

如果有多个线程,一个函数向列表中添加一个值,另一个函数接受该值。这两者的区别是什么:

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行,带有if条件)来减缓这种情况下的处理过程,如果他们可以使用集合,这也给了他们重复过滤的优势。

队列
维护可能非唯一元素的顺序<另一方面,代码>集合,不保持顺序,并且可能不包含重复项

在您的情况下,您可能需要记录每件刮伤的东西和/或刮伤的相对顺序。在这种情况下,请使用
队列
。如果您只是想要一个您所刮取的独特事物的列表,而不关心刮取它们的相对顺序,请使用
set

正如
@mata
所指出的,如果多个线程正在向队列中产生和消费,那么应该使用
队列<代码>队列
实现与生产者/消费者
线程
协作所需的阻塞功能<代码>队列是线程安全的,
集合
不是线程安全的

在本例中,来自文档:

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

消费者线程中的
获取
(即
工作者
)块,直到
队列中有东西要获取,
生产者线程块中的
加入
,直到放入
队列中的每个项目都被消费,消费者线程中的
task_done
告诉队列它获得的项目已被消费

这只是一个原因,更引人注目的是队列的同步特性、阻塞访问、限制大小的可能性等等……您所说的阻塞访问是什么意思?检查队列是否为空?我只使用try and except和continue-inside-while-true循环。
get
默认情况下会一直阻塞,直到有东西被放入队列并可以获取为止。与引发异常以指示
队列
为空相比,它更像python。如果查看get定义内部,则其中有一个try语句。还有很多if和else语句。谢谢你和Stackoverflow每次都给我指出了正确的方向。