2017-02-07 1 views
0

멀티 프로세싱 사용 후 나오지 않는 것은 그래서 난 그냥 멀티 간단한 코드를 작성 내가이 명령을 실행할 때, 수영장() 및 큐()과는 이제까지파이썬 스크립트

python3 m.py 

내가 볼 수있는 오픈 계속 내 Cpu 코어 중 5 개가 작업을 끝내고 CPU 사용량이 정상으로 줄어들지 만 강철은 닫히지 않고 Ctrl + C를 눌러 종료해야합니다.

여기 내 코드입니다 :

from multiprocessing import Queue,Pool 
    import csv,json 
    from itertools import chain 

    def worker(line): 
    j_string = json.dumps(line) 
    worker.output_q.put(j_string) 

    def worker_init(output_q): 
    worker.output_q = output_q 

    f_open = open('khodro','rt') 
    f_csv = csv.reader(f_open) 

    output_q = Queue() 

    pool = Pool(5,worker_init,[output_q]) 
    pool.imap(worker,chain(f_csv),1000) 
    raise SystemExit() 
+0

Windows를 사용하고 있습니까? 풀을 생성하기 전에'if __name __ == "__ main __"'을 추가해야합니다. –

+0

우분투 16.04에 메신저, 내가이 추가하지만, 스크립트는 그냥 어떤 처리를하지 않고 닫히고, 왜 우리는 수영장을 만들기 전에 이것을 작성해야합니까? – ali

+0

전체 스크립트를 붙여 넣었습니까? 'imap'은 블로킹을하지 않고 게시 한 스크립트는 5 개의 프로세스를 생성했지만 상위 프로세스는 즉시 종료되고 하위 프로세스도 종료됩니다. 마지막에'join()'을했거나'for el in pool.imap'에 의해 요소를 소비하지만 붙여 넣은 스크립트는 사용자가 설명하는 것을하지 않습니다 – hansaplast

답변

0

나는 이유는 정확히 모르겠지만, 문제는 worker.output_q.put(j_string)로 출력 큐를 작성 당신에있다. 해당 줄을 제거하면 스크립트가 종료됩니다. 인쇄중인 줄을 인쇄 할 경우 마지막 줄을 처리 한 후 멈추는 것을 볼 수 있습니다. 당신이 explicetly close() 끝에 출력 대기열을하지 않기 때문에 그것은 것 같아요. 사실 worker에서 마지막 행인지 여부를 알 수 없기 때문에 그럴 수 없습니다.

좋은 소식은 당신이 출력 큐 달성하기 위해 노력하고하는 것은 imap 자체에 의해 이루어집니다 때 기능에 return : imap으로 가득 큐를 통해

from multiprocessing import Queue,Pool 
import csv,json 
from itertools import chain 

def worker(line): 
    return json.dumps(line) 

f_open = open('generated.json','rt') 
f_csv = csv.reader(f_open) 
pool = Pool(5) 

for j_string in pool.imap(worker,f_csv,1000): 
    print(j_string) 

for 루프 반복 따라서 내부적으로는 AFAIK가 달성하려는 것과 동일합니다.

imap은 차단하지 않으므로 모든 작업자가 실행되기 전에 worker의 출력 처리를 시작할 수 있습니다.