2014-06-10 2 views
0

나는 스레딩과 큐잉에 익숙하지 않다. 아래 함수는 단지 문자열을 취하고 잘린 문자 ex: 789 it returns ['789','89','9']의 목록을 반환합니다. 그러나 나는 이상한 결과를 얻고 있습니다.파이썬과 큐잉 스레딩

def do_stuff(q): 

    while True: 
     x=str(q.get()) 
     print [x[i:]for i in range(len(x))] 
     q.task_done() 

q = Queue(maxsize=0) 
num_threads = 10 

for i in range(num_threads): 
    worker = threading.Thread(target=do_stuff, args=(q,)) 
    worker.setDaemon(True) 
    worker.start() 

for x in xrange(10,100000): 
    q.put(x) 

q.join() 

myoutput :

['10', ['0''1]1'[ 
    , '12''1', ]'2' 
    ][ 
    '13'[, '1'43''[, ]'15''4' 
    , ]['5' 
    '16'], 
    '6' ][[ 
    '17''18', , '7''8'[]]'19' 

    , '9'] 
    ['20'[, '21''0'[, ]'22''1' 
    , ]['2' 
    '23' ], [ 
    '3''24'][, 
    '25''4'[, ]'26''5' 
    , ]['6' 
    '27'][, 
    '28''7', ]'8' 
    ][ 
    '29', '9'] 
    ['30', '0'] 
    [['31''32', , '1'['2']'33'] 
    , 
    ['3''34'], 
    '4'[]'35' 
    , [['5''36''37'], , 
    '6''7'][] 
    '38' 
    , '8'[]'39 
    ', '9'] 
    ['40'[, '41''0', ]'1' 
    ][ 
    '42'[, '43''2'[, ]'44''3' 
    , ]'4' 
    ]['45' 
    , '5'[]'46' 
    , '6'[]'47' 
    , '7'][ 
    '48', '8'] 
    ['49', '9'] 
    ['50'[, '51''0'[, ]'52''1' 
    , ]'2' 
    ] 
    ['53', ['3''54'], 
    '4'[[]'55''56' 
    , , '5''6'][] 
    '57 
    ', '7'] ..... so on 

하지만 예상 출력 :

['10','0'] 
['11','1'] 
['12','1'] so on 

왜 큐가 무시됩니다?

+1

입니다. print 서술문 주위에 자물쇠를 넣으면 예상 한 결과물을 더 가까이에서 찾을 수 있다고 생각합니다. – dano

+0

@dano는 잠금을 가하는 방법을 안내해 줄 수 있습니다. 스레딩에 익숙하지 않습니다. –

+0

@sundarnataraj 샌다 나타 라지 : 답변과 더 많은 토론이있는 다른 질문에 대한 링크를 제공합니다. – nneonneo

답변

0

문제는 Dano가 스레드가 대기열을 넘었다 고 말했습니다. 그것을 해결하기 위해 나는 자물쇠를 찾았다. 내가 방법을 발견

queueLock = threading.Lock() 

def do_stuff(q): 
    print threading.current_thread() 
    while True: 
     queueLock.acquire() 
     x=str(q.get()) 
     print [x[i:]for i in range(len(x))] 
     queueLock.release()  
     q.task_done() 

이제 출력은 표준 출력에 쓰기로 스레드가 단지 서로 스테핑처럼 보이는

['10', '0'] 
['11', '1'] 
['12', '2'] 
['13', '3'] 
['14', '4']... 

감사 단오