代码之家  ›  专栏  ›  技术社区  ›  probat

python parallel processes input()卡在循环中

  •  2
  • probat  · 技术社区  · 5 年前

    python 3.5版,Windows 10

    我正在使用多个进程并尝试捕获用户输入。搜索我看到的所有东西使用时会发生奇怪的事情 input() 具有多个进程。经过8个多小时的尝试,我的工具都没用,我肯定我做错了,但我一辈子都搞不清楚。

    下面是一个非常简单的程序,演示了这个问题。现在,当我在pycharm中运行这个程序时,它可以正常工作,但是当我使用 pyinstaller 要创建单个可执行文件,它将失败。程序始终卡在一个循环中,要求用户输入如下所示的内容: enter image description here .

    我非常肯定这与Windows如何从我读过的东西中接收标准输入有关。我还尝试将用户输入变量作为 Queue() 项到函数,但相同的问题。我看你应该放 输入() 在主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()
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   Darkonaut    5 年前

    你需要使用 multiprocessing.freeze_support() 使用pyinstaller生成Windows可执行文件时。

    直接从 docs :

    多处理。冻结支持()

    添加对使用多处理的程序被冻结以生成Windows可执行文件的支持。(已使用py2exe、pyinstaller和cx-freeze进行测试。)

    需要在if之后直接调用此函数 名称 = 主要的 '主模块的行。例如:

    from multiprocessing import Process, freeze_support
    
    def f():
        print('hello world!')
    
    if __name__ == '__main__':
        freeze_support()
        Process(target=f).start()
    

    如果省略了freeze_support()行,那么尝试运行冻结的可执行文件将引发runtimeerror。

    在Windows以外的任何操作系统上调用freeze_support()都不起作用。此外,如果模块在Windows上由python解释器正常运行(程序没有被冻结),则冻结支持()无效。

    在您的示例中,您还应该处理不必要的代码重复。