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' 打印后输入的内容。我想那只是为了玩玩而已。
我目前正在制作一个 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' 打印后输入的内容。我想那只是为了玩玩而已。