У меня есть некоторые проблемы с использованием многопроцессорности и 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
.