Pool.imap зависает в venv, но работает, если не использует venv - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть некоторые проблемы с использованием многопроцессорности и venv в Python 3.7 (в Windows 10).У меня есть следующий скрипт в testing.py:

from multiprocessing import Pool

def square(number):
    return number * number

def main():
    print("Starting")

    p = Pool(1)
    l = [1,2,3]

    for res in p.imap(square, l):
        print("Res:", res)

    print("Done")

if __name__ == '__main__':
    main()

И я выполняю его, используя следующее

python testing.py

Я получаю следующий вывод (как и ожидалось):

Starting
Res: 1
Res: 4
Res: 9
Done

Однако, если я создаю и активирую venv, а затем запускаю то же самое, используя

python -m venv venv
venc\Script\activate.bat
python testing.py

Единственный вывод, который я получаю, это

Starting

, и сценарий никогда не завершается, нопросто продолжает ждать.Если я деактивирую venv и запускаю его снова, он снова будет работать.

venv\Script\deactivate.bin
python testing.py

Если я, когда скрипт зависает, когда я запускаю его в venv, нажмите Ctrl + CI, получите следующее:

KeyboardInterrupt
Process SpawnPoolWorker-34:
Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\multiprocessing\process.py", line 297, in _bootstrap
    self.run()
  File "C:\Program Files\Python37\lib\multiprocessing\process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Program Files\Python37\lib\multiprocessing\pool.py", line 110, in worker
    task = get()
  File "C:\Program Files\Python37\lib\multiprocessing\queues.py", line 351, in get
    with self._rlock:
  File "C:\Program Files\Python37\lib\multiprocessing\synchronize.py", line 95, in __enter__
    return self._semlock.__enter__()
KeyboardInterrupt
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Program Files\Python37\lib\multiprocessing\__init__.py", line 16, in <module>
    from . import context
  File "C:\Program Files\Python37\lib\multiprocessing\context.py", line 6, in <module>
    from . import reduction
  File "C:\Program Files\Python37\lib\multiprocessing\reduction.py", line 16, in <module>
    import socket
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 963, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 906, in _find_spec
  File "<frozen importlib._bootstrap_external>", line 1280, in find_spec
  File "<frozen importlib._bootstrap_external>", line 1252, in _get_spec
  File "<frozen importlib._bootstrap_external>", line 1364, in find_spec
  File "<frozen importlib._bootstrap_external>", line 81, in _path_stat

В первый раз, когда я делаю это, я получаю SpawnPoolWorker-1, во второй раз SpawnPoolWorker-2 и т. Д., Но он просто увеличивается, поэтому создается впечатление, что бассейн просто продолжает порождать рабочих, но я не знаю почему,и почему он делает это только в venv.

...