池.imap挂起在venv中,但如果不使用ven则有效

2024-04-19 04:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python3.7(Windows10)中使用多处理和venv时遇到了一些问题。我在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+C可以得到以下结果:

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。你知道吗


Tags: inpyselfvenvliblinefilesimportlib