2017-02-07 4 views
0

так что я просто написал простой код с многопроцессорной, бассейн() и Queue(), и когда я выполнить его с этой командой он держит открытым навсегдапитон скрипт не выходя после использования многопроцессорных

python3 m.py 

я могу видеть что 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

Вы используете окна? вам нужно добавить 'if __name __ ==" __ main __ "' перед созданием пула. –

+0

im on ubuntu 16.04, я добавляю это, но сценарий просто закрывается без какой-либо обработки, почему мы должны писать это перед созданием пула? – ali

+0

Вы ввели полный скрипт? 'imap' не блокирует, и вы отправили по сценарию 5 процессов, но родительский процесс немедленно завершает работу, а также завершает работу подпроцессов. Либо у вас есть 'join()' в конце, либо вы потребляете элементы 'для el в pool.imap', но скрипт, который вы вставили, не выполняет то, что вы описываете. – hansaplast

ответ

0

Я не знаю, почему именно, но проблема заключается в вас заполнении очереди вывода с worker.output_q.put(j_string). Если вы удалите эту строку, сценарий завершится. Если вы распечатываете строку, она печатает, вы видите, что она зависает после обработки последней строки. Я предполагаю, что это потому, что вы не объясните close() выходную очередь в конце. На самом деле вы не можете, потому что в worker вы не знаете, последняя ли она или нет.

Хорошая новость заключается в том, что вы пытаетесь достичь с помощью очереди вывода осуществляется сам imap при return в функции:

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 цикл перебирает очередь, которая заполняется imap , поэтому внутренне это (AFAIK) так же, как вы пытаетесь достичь.

С imap не блокируется, вы можете начать обработку выходов worker, прежде чем все рабочие пройдут.