Многопроцессорный код не работает в режиме отладки только в Ubuntu - PullRequest
0 голосов
/ 16 февраля 2020

Следующий код является стандартным кодом для экспериментов с внутрипроцессным взаимодействием.

Он работает без проблем в 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
...