Взаимная блокировка Python subprocess.popen при манипулировании стандартным вводом и выводом?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Взаимная блокировка Python subprocess.popen при манипулировании стандартным вводом и выводом?

Сообщение Anonymous »

Я написал сценарий для управления стандартными вводами и выводами для шахматного движка. По сути, я открываю программу с помощью subprocess.popen и манипулирую вводом и выводом, используя threading.Thread для каждого.
Однако, если создается несколько экземпляров моего скрипта, программа перестает работать примерно через 15 минут. Я предполагаю, что это тупик из-за полного буфера, описанного в документации. К сожалению, я не могу использовать рекомендуемую функцию «общения», поскольку мне нужно постоянно изменять как ввод, так и вывод. Есть ли способ справиться с этим? Вот минимальная версия того, что я делаю:

Код: Выделить всё

import sys
import time
import subprocess
import threading

class ChessEngine:

def __init__(self):
self.lock = threading.Lock()

def write(self, command):
with self.lock:
self.engine.stdin.write(command + "\n")
self.engine.stdin.flush()

def read_stdout(self):
while True:
text = self.engine.stdout.readline()
text = text.replace("foo", "bar")
print(text, end="", flush=True)

def read_stdin(self):
while True:
command = input()
command = command.replace("foo", "bar")
self.write(command)

def run(self):
self.engine = subprocess.Popen(
"/usr/games/stockfish",
shell=True,
universal_newlines=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
bufsize=1,
cwd=self.folder,
)
threading.Thread(target=self.read_stdout, daemon=True).start()
threading.Thread(target=self.read_stdin, daemon=True).start()
while True:
time.sleep(1)
if not self.engine.poll() is None:
sys.exit(0)

if __name__ == "__main__":
chess_engine = ChessEngine()
chess_engine.run()

Я искал несколько способов, как убедиться, что скрипт не блокируется, но безуспешно.

Подробнее здесь: https://stackoverflow.com/questions/790 ... and-stdout
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»