Как использовать многопроцессорность с функцией input() и избежать ошибки EOFError: EOF при чтении строки?

В настоящее время я делаю программу Python, которая должна использовать многопроцессорность, где одна функция обрабатывает пользовательский интерфейс, а другая обрабатывает обновление файлов данных. Причина ошибки EOFError: EOF when reading a line указывается в тот момент, когда моя функция пользовательского интерфейса вызывает пользовательский ввод с помощью функции 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()

В результате возникает ошибка EOFError: EOF when reading a line в строке 14, или, другими словами, фрагмент кода input ("Enter a string: ").


person jackfish6    schedule 15.09.2020    source источник


Ответы (1)


Стандартный поток ввода (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)

Странно выводить на консоль из одного потока/процесса, в то время как вы принимаете консольный ввод в другом. На самом деле, кажется, что все испортилось. Вы получаете не весь введенный вами ввод, а только то, что поступило с момента последнего напечатанного «X». Я предполагаю, что это просто для игр.

person CryptoFool    schedule 15.09.2020
comment
Рад, что смог помочь. Я хотел бы получить кивок с зеленой галочкой. :) - person CryptoFool; 15.09.2020
comment
Нет проблем, приятель, забыл. - person jackfish6; 15.09.2020