from concurrent.futures import ProcessPoolExecutor
import os
import time
def parInnerLoop(item):
a = 2+item
print(f'A. {a} Processing {os.getpid()} done on {item}\n')
exec(open('mainWork.py').read())
print(f'D. {a} Processing {os.getpid()} done on {item}\n')
def main():
with ProcessPoolExecutor(max_workers=4) as executor:
for itemNo in range(10):
executor.submit(parInnerLoop, itemNo)
print('done')
if __name__ == '__main__':
main()
mainWork.py
print(f'B. {a} Processing {os.getpid()} done on {item}\n')
a = 12
print(f'C. {a} Processing {os.getpid()} done on {item}\n')
Ошибка:
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "D:\Program Files\Python\Python37\Lib\concurrent\futures\process.py", line 101, in _python_exit
thread_wakeup.wakeup()
File "D:\Program Files\Python\Python37\Lib\concurrent\futures\process.py", line 89, in wakeup
self._writer.send_bytes(b"")
File "D:\Program Files\Python\Python37\Lib\multiprocessing\connection.py", line 183, in send_bytes
self._check_closed()
File "D:\Program Files\Python\Python37\Lib\multiprocessing\connection.py", line 136, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Проблемы:
- Ошибка, возникает в конце программы .
- Я хочу выполнить весь код
mainWork.py
как часть parInnerLoop
, так что изменение значения a
должно быть отражено как в parInnerLoop
, так и в mainWork.py
и т. Д. -versa. Я получил вывод следующим образом. Значение a
не изменяется, когда печать начинается с D. ...
, я хочу, чтобы оно было 12.
Вывод для элемента 0
A. 2 Processing 19784 done on 0
B. 2 Processing 19784 done on 0
C. 12 Processing 19784 done on 0
D. 2 Processing 19784 done on 0
Что происходит? Любая помощь, пожалуйста.
Чего я в конечном итоге хочу достичь: запускать один и тот же код параллельно с различными настройками, не мешая друг другу
Дополнительно:
- Я тестировал ProcessPoolExecutor работает должным образом, как показано здесь .
- Я протестировал
exec(open('run.py').read())
, работая как задумано, используя следующий код:
main.py
def myFun():
a = 1
b = 2
print(a)
exec(open('run.py').read())
#execfile("run.py")
print(a)
print(b)
print(c)
def main():
myFun()
if __name__ == '__main__':
main()
run.py
a = a+5
b = 10
c = 15
output
1
6
10
15