2016-08-31 1 views
3

В случае, если существует многопоточность и одна функция, которая добавляет значение в список и другую функцию, которая принимает это значение. Что бы разница будет с:Разница между очередью и наборами Python

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 линий с, если условия замедления процесса для данной ситуации, если они могут использовать наборы, которые также дает им преимущество дублей фильтрации ,

ответ

5

Queues поддерживать порядок, возможно, неповторимых элементов. Sets, с другой стороны, не поддерживают порядок и могут не содержать дубликатов.

В вашем случае вам может потребоваться вести запись каждой царапины и/или относительного порядка, в котором она была очищена. В этом случае используйте queues. Если вам просто нужен список уникальных вещей, которые вы выскоблили, и вас не волнует относительный порядок, в котором вы их скребли, используйте sets.

Как указано @mata, следует использовать queue, если несколько потоков производят и потребляют его/из него. 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 

get в потребительском потоке (т.е. worker) блокирует до тех пор, пока что-то в queue получить, join в производителя резьбы блоков до каждого элемента, который он положил в queue, и task_done в потребительском потоке сообщает очереди, что предмет, который он получил, был поглощен.

+2

Это единственная причина, более неотложные функции синхронизации очереди, блокировка доступа, возможность ограничения размера и т. Д. – mata

+0

Что вы имеете в виду, блокируя доступ? Проверка, что очередь пуста или нет? Я просто использую try и за исключением того, что продолжаю внутри while true. –

+0

'get', по умолчанию блокирует, пока что-то не было помещено в очередь и доступно для получения. Гораздо больше Pythonic, чем создание исключения, указывающее, что 'queue' пуст. –