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每次都给我指出了正确的方向。