pro*_*bat 4 python windows parallel-processing pyinstaller python-multiprocessing
Python v3.5、Windows 10
我正在使用多个进程并尝试捕获用户输入。input()搜索我看到的所有内容,在使用多个进程时会发生奇怪的事情。经过 8 个小时以上的尝试,我实施的任何措施都不起作用,我确信我做错了,但我一生都无法弄清楚。
以下是演示该问题的非常精简的程序。现在,当我在 PyCharm 中运行该程序时,它可以正常工作,但是当我用来pyinstaller创建单个可执行文件时,它会失败。该程序不断陷入循环,要求用户输入如下所示的内容:
。
我非常确定这与 Windows 如何从我读过的内容中获取标准输入有关。我还尝试将用户输入变量作为Queue()项目传递给函数,但存在同样的问题。我读到你应该放入input()主要的 python 进程,所以我在下面这样做了if __name__ = '__main__':
from multiprocessing import Process
import time
def func_1(duration_1):
while duration_1 >= 0:
time.sleep(1)
print('Duration_1: %d %s' % (duration_1, 's'))
duration_1 -= 1
def func_2(duration_2):
while duration_2 >= 0:
time.sleep(1)
print('Duration_2: %d %s' % (duration_2, 's'))
duration_2 -= 1
if __name__ == '__main__':
# func_1 user input
while True:
duration_1 = input('Enter a positive integer.')
if duration_1.isdigit():
duration_1 = int(duration_1)
break
else:
print('**Only positive integers accepted**')
continue
# func_2 user input
while True:
duration_2 = input('Enter a positive integer.')
if duration_2.isdigit():
duration_2 = int(duration_2)
break
else:
print('**Only positive integers accepted**')
continue
p1 = Process(target=func_1, args=(duration_1,))
p2 = Process(target=func_2, args=(duration_2,))
p1.start()
p2.start()
p1.join()
p2.join()
Run Code Online (Sandbox Code Playgroud)
multiprocessing.freeze_support() 当您使用 PyInstaller 生成 Windows 可执行文件时需要使用。
直接来自文档:
multiprocessing.freeze_support()
添加对使用多处理的程序被冻结以生成 Windows 可执行文件的支持。(已使用 py2exe、PyInstaller 和 cx_Freeze 进行测试。)
需要在主模块的if name == ' main ' 行之后直接调用此函数。例如:
from multiprocessing import Process, freeze_support
def f():
print('hello world!')
if __name__ == '__main__':
freeze_support()
Process(target=f).start()
Run Code Online (Sandbox Code Playgroud)
如果省略 freeze_support() 行,则尝试运行冻结的可执行文件将引发 RuntimeError。
在 Windows 以外的任何操作系统上调用 freeze_support() 都不会产生任何影响。另外,如果模块在 Windows 上由 Python 解释器正常运行(程序没有被冻结),则 freeze_support() 不起作用。
在您的示例中,您还应该解决不必要的代码重复。