Python: exe c с ProcessPoolExecutor - PullRequest
       10

Python: exe c с ProcessPoolExecutor

1 голос
/ 26 апреля 2020
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

Проблемы:

  1. Ошибка, возникает в конце программы .
  2. Я хочу выполнить весь код 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

Что происходит? Любая помощь, пожалуйста.

Чего я в конечном итоге хочу достичь: запускать один и тот же код параллельно с различными настройками, не мешая друг другу

Дополнительно:

  1. Я тестировал ProcessPoolExecutor работает должным образом, как показано здесь .
  2. Я протестировал 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
...