Saya memiliki skrip multiprocessing
dengan pool.map
yang berfungsi. Permasalahannya adalah tidak semua proses membutuhkan waktu lama untuk diselesaikan, sehingga beberapa proses tertidur karena menunggu hingga semua proses selesai (masalah yang sama seperti pada pertanyaan ini). Beberapa file selesai dalam waktu kurang dari satu detik, yang lain membutuhkan waktu beberapa menit (atau jam).
Jika saya memahami manual (dan postingan ini) benar, pool.imap
tidak menunggu semua proses selesai, jika sudah selesai, ia menyediakan file baru untuk diproses. Ketika saya mencobanya, skrip mempercepat file untuk diproses, yang kecil diproses seperti yang diharapkan, file besar (yang membutuhkan lebih banyak waktu untuk diproses) tidak selesai sampai akhir (terbunuh tanpa pemberitahuan?). Apakah ini perilaku normal untuk pool.imap
, atau apakah saya perlu menambahkan lebih banyak perintah/parameter? Ketika saya menambahkan time.sleep(100)
di bagian else
sebagai pengujian, itu memproses lebih banyak file besar tetapi proses lainnya tertidur. Ada saran? Terima kasih
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
sedang menunggu semua proses selesai untuk mengembalikan hasil.Imap
mengembalikan hasilnya segera setelah proses pertama selesai, dan mungkin menghentikan proses lainnya dan memberikan semua pekerjaan baru. Apakah ini benar? - person avierstr   schedule 25.11.2016