У меня есть скрипт multiprocessing
с pool.map
, который работает. Проблема в том, что не все процессы занимают столько времени, чтобы завершиться, поэтому некоторые процессы засыпают, потому что они ждут, пока все процессы не будут завершены (та же проблема, что и в этот вопрос). Некоторые файлы создаются менее чем за секунду, другие занимают минуты (или часы).
Насколько я понимаю руководство (и этот пост) правильно, pool.imap
не ждет завершения всех процессов, если один из них завершен, он предоставляет для обработки новый файл. Когда я пытаюсь это сделать, сценарий ускоряет обработку файлов, маленькие обрабатываются, как и ожидалось, большие файлы (для обработки которых требуется больше времени) не заканчиваются до конца (уничтожаются без предупреждения?). Это нормальное поведение для pool.imap
или мне нужно добавить больше команд/параметров? Когда я добавляю time.sleep(100)
в часть else
в качестве теста, он обрабатывает больше больших файлов, но другие процессы засыпают. Какие-либо предложения ? Спасибо
def process_file(infile):
#read infile
#compare things in infile
#acquire Lock, save things in outfile, release Lock
#delete infile
def main():
#nprocesses = 8
global filename
pathlist = ['tmp0', 'tmp1', 'tmp2', 'tmp3', 'tmp4', 'tmp5', 'tmp6', 'tmp7', 'tmp8', 'tmp9']
for d in pathlist:
os.chdir(d)
todolist = []
for infile in os.listdir():
todolist.append(infile)
try:
p = Pool(processes=nprocesses)
p.imap(process_file, todolist)
except KeyboardInterrupt:
print("Shutting processes down")
# Optionally try to gracefully shut down the worker processes here.
p.close()
p.terminate()
p.join()
except StopIteration:
continue
else:
time.sleep(100)
os.chdir('..')
p.close()
p.join()
if __name__ == '__main__':
main()
imap
.Map
ожидает завершения всех процессов, чтобы вернуть результаты.Imap
возвращает результат, как только завершается первый процесс, и, вероятно, завершает остальные и дает всем новое задание. Может ли это быть правильным? - person avierstr   schedule 25.11.2016