Следующий код является стандартным кодом для экспериментов с внутрипроцессным взаимодействием.
Он работает без проблем в Pycharm под Windows (конфигурация отладки и запуска) и под Ubuntu (конфигурация запуска).
Только в режиме Pycharm / Ubuntu / Debug генерируются исключения, видимые ниже. Как мне изменить код (или переменные среды), чтобы избежать этих исключений?
Существующие переменные среды:
PYTHONUNBUFFERED=1;PYDEVD_USE_CYTHON=NO;PYDEVD_USE_FRAME_EVAL=NO
Код:
import multiprocessing as mp
import numpy as np
def init(vv, aa):
global v
v = vv
def worker2(i):
if v.value == 97:
return -100
if i > 4:
# with v.get_lock():
v.value = 97
return -1
return i
if __name__ == "__main__":
N = 10
v = mp.Value('i', 3)
a = np.array([0, 1])
p = mp.Pool(initializer=init, initargs=(v, a))
myResult = p.map(worker2, range(N))
print("myResult=", myResult)
print("v=", v.value)
print('fin')
вывод:
/home/user/venv/numba/bin/python3.6 /home/user/tmp/0120-pycharm-neuinstallation/detarred/pycharm-2019.3/plugins/python/helpers/pydev/pydevd.py --multiproc --save-signatures --qt-support=auto --client 127.0.0.1 --port 38063 --file /home/user/PycharmProjects/0650_r_b/learning_multiprocessing/multiprocessingArrays.py
warning: PYDEVD_USE_CYTHON environment variable is set to 'NO'. Frame evaluator will be also disabled because it requires Cython extensions to be enabled in order to operate correctly.
pydev debugger: process 24167 is connecting
Connected to pydev debugger (build 193.5233.109)
myResult= [0, 1, 2, 3, 4, -1, -100, -100, -100, -100]
v= 97
fin
Exception ignored in: <module 'threading' from '/home/user/anaconda3/lib/python3.6/threading.py'>
Traceback (most recent call last):
File "/home/user/anaconda3/lib/python3.6/threading.py", line 1294, in _shutdown
Process ForkPoolWorker-4:
t.join()
File "/home/user/anaconda3/lib/python3.6/threading.py", line 1056, in join
self._wait_for_tstate_lock()
File "/home/user/anaconda3/lib/python3.6/threading.py", line 1072, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt:
Process ForkPoolWorker-3:
Traceback (most recent call last):
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/user/anaconda3/lib/python3.6/multiprocessing/pool.py", line 108, in worker
task = get()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/queues.py", line 334, in get
with self._rlock:
File "/home/user/anaconda3/lib/python3.6/multiprocessing/synchronize.py", line 95, in __enter__
return self._semlock.__enter__()
KeyboardInterrupt
Process ForkPoolWorker-2:
Process ForkPoolWorker-1:
Traceback (most recent call last):
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/user/anaconda3/lib/python3.6/multiprocessing/pool.py", line 108, in worker
task = get()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/queues.py", line 334, in get
with self._rlock:
File "/home/user/anaconda3/lib/python3.6/multiprocessing/synchronize.py", line 95, in __enter__
return self._semlock.__enter__()
KeyboardInterrupt
Traceback (most recent call last):
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/user/anaconda3/lib/python3.6/multiprocessing/pool.py", line 108, in worker
task = get()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/queues.py", line 335, in get
res = self._reader.recv_bytes()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File "/home/user/anaconda3/lib/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
buf = self._recv(4)
File "/home/user/anaconda3/lib/python3.6/multiprocessing/connection.py", line 379, in _recv
chunk = read(handle, remaining)
KeyboardInterrupt
Traceback (most recent call last):
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/user/anaconda3/lib/python3.6/multiprocessing/pool.py", line 108, in worker
task = get()
File "/home/user/anaconda3/lib/python3.6/multiprocessing/queues.py", line 334, in get
with self._rlock:
File "/home/user/anaconda3/lib/python3.6/multiprocessing/synchronize.py", line 95, in __enter__
return self._semlock.__enter__()
KeyboardInterrupt
Process finished with exit code 0