How to use multiprocessing with input() function and avoid "EOFError: EOF when reading a line"?

How to use multiprocessing with input() function and avoid "EOFError: EOF when reading a line"?

我目前正在制作一个 Python 程序,该程序应该使用多处理,其中一个函数处理 UI,另一个函数处理更新数据文件。错误 EOFError: EOF when reading a line 的原因在我的 UI 函数调用函数 input().

要求用户输入时指出

下面是简化的代码,可以作为示例并在我的真实程序中产生完全相同的错误:

import multiprocessing
import time

# Class with methods used to print strings.
class Printing:

    # Setting of initial values is ignored.
    def __init__(self):
        pass

    # Continuously calls for user input that is then printed.
    def printInput(self):
        while True:
            string = input("Enter a string: ")
            print(string)

# Continuously prints the  character "X"
def printXs():
    while True:
        time.sleep(1) # Just used to slows the printing output.
        print("X")

# Execution of script when told to run.
if __name__=='__main__':
    mp1 = multiprocessing.Process(target=printXs)
    mp2 = multiprocessing.Process(target=Printing().printInput)

    mp1.start()
    mp2.start()

导致的错误是第 14 行的 EOFError: EOF when reading a line,或者换句话说,那段代码是 input ("Enter a string: ").

标准输入流 (stdin) 在创建时未附加到 Process 进程。由于多个进程从同一个流读取输入没有意义,默认情况下假设 stdin 将由主进程独占读取。

在您的情况下,您将只从一个进程获取输入,但您希望它成为您生成的 Process 进程之一。在这种情况下,您可以像这样附加标准输入:

def printInput(self):
    sys.stdin = open(0) # <--- Here's the magic line...you'll need to "import sys" above too
    while True:
        string = input("Enter a string: ")
        print(string)

从一个 thread/process 输出到控制台,而在另一个 thread/process 中接收控制台输入,这很奇怪。事实上,它似乎把事情搞砸了。您不会得到您键入的所有输入,而只会得到自上次 'X' 打印后输入的内容。我想那只是为了玩玩而已。