Контексты файлов могут быть переданы между процессами , поэтому я не уверен, почему ваш код блокируется в обработчике файлов. Сказав это, я предполагаю, что вы выполняете большую работу в своей функции run()
, поэтому накладные расходы по открытию / закрытию файла один раз за процесс не должны быть ужасно значительными. Если проделана небольшая работа, многопроцессорная обработка, возможно, в любом случае не лучший выбор, поскольку она требует серьезных накладных расходов.
Кроме того, fh.write(mylist)
повышает TypeError: write() argument must be str, not int
, поэтому нам нужно разыграть с fh.write(str(mylist))
.
Вот обходной путь:
import multiprocessing
import subprocess
from concurrent.futures import ProcessPoolExecutor
from functools import partial
def worker_process_write_output(lock, mylist):
output = subprocess.run("dir /b", shell=True, stdout=subprocess.PIPE,
universal_newlines=True).stdout
with lock:
with open("outfile.txt", "a") as fh:
fh.write(str(mylist))
fh.writelines(output)
if __name__ == '__main__':
mylist = [1, 2, 3, 4]
with ProcessPoolExecutor() as executor:
lock = multiprocessing.Manager().Lock()
executor.map(partial(worker_process_write_output, lock), mylist)