I was using this answer in order to run parallel commands with multiprocessing in Python on a Linux box.
My code did something like:
import multiprocessing
import logging
def cycle(offset):
# Do stuff
def run():
for nprocess in process_per_cycle:
logger.info("Start cycle with %d processes", nprocess)
offsets = list(range(nprocess))
pool = multiprocessing.Pool(nprocess)
pool.map(cycle, offsets)
But I was getting this error: OSError: [Errno 24] Too many open files
So, the code was opening too many file descriptor, i.e.: it was starting too many processes and not terminating them.
I fixed it replacing the last two lines with these lines:
with multiprocessing.Pool(nprocess) as pool:
pool.map(cycle, offsets)
But I do not know exactly why those lines fixed it.
What is happening underneath of that with
?
self.terminate()
– Locomobilewith
version is implicitly callingpool.close()
afterpool.map()
returns. According to the docs, that "Prevents any more tasks from being submitted to the pool. Once all the tasks have been completed the worker processes will exit". This likely causes the open files each task has open to be closed. – Orbit