2016-08-31 2 views
3

목록에 값을 추가하는 다중 스레드와 하나의 함수와 그 값을 취하는 다른 함수가있는 경우. 의 차이는 무엇 일 것입니다 :대기열과 세트 파이썬의 차이

사람들은 또한 그들에게 필터링 중복의 이점을 제공하는 세트를 사용할 수있는 경우 조건이이 상황에 대한 과정을 둔화 경우에 170-180 라인 인 큐 모듈을 사용하는 이유는 무엇입니까
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) 

.

답변

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가 넣어 각 항목까지 생산자 스레드 블록에서 얻을 수있는 queue에 뭔가, join있을 때까지 (즉, worker) 블록 : 워드 프로세서에서이 예에서

소비자 스레드의 task_done은 소비 된 항목을 대기열에 알립니다.

+2

대기열의 동기화 기능, 액세스 차단, 크기 제한 가능성 등이 더 큰 이유 중 하나입니다. – mata

+0

액세스를 차단한다는 것은 무엇을 의미합니까? 대기열이 비어 있는지 확인 하시겠습니까? 나는 단순히 try를 사용하고 except는 true loop 동안 계속 진행한다. –

+0

'get'은 기본적으로 어떤 것이 대기열에 놓이게 될 때까지 차단하고 얻을 수 있습니다. '큐 '가 비어 있음을 나타 내기 위해 예외를 발생시키는 것보다 훨씬 더 파이썬 적입니다. –

관련 문제