18-03-2018, 04:56 PM
hola,
tengo un programa que dentro de un hilo corre un subprocess.Popen. Este proceso recibe unos datos iniciales y empieza a soltar datos procesados en función de esos datos iniciales, indefinidamente.
El problema es cuando quiero enviarle nuevos datos inciales mientras está procesando las salidas anteriores. Me sigue soltando los datos viejos que tiene acumulados.
El programa simplificado es este:
He intentado matar el proceso (terminandose automaticamente el hilo) y sus hijos asi:
pero no me funciona bien. La mayor parte de las veces deja algun "hijo" colgando.
Una alternativa podría ser poder mandar una señal o evento externo al hilo con un comando tipo STOP para que pare el hilo (put('stop')), pero desde fuera del hilo. Aqui ando un poco perdido.
¿alguna idea?
tengo un programa que dentro de un hilo corre un subprocess.Popen. Este proceso recibe unos datos iniciales y empieza a soltar datos procesados en función de esos datos iniciales, indefinidamente.
El problema es cuando quiero enviarle nuevos datos inciales mientras está procesando las salidas anteriores. Me sigue soltando los datos viejos que tiene acumulados.
El programa simplificado es este:
Código:
# Python 3.6.1
import subprocess, time, threading
def inicia_robot(posicion):
posic_uci = 'position fen ' + posicion
engine = subprocess.Popen(
'stockfish.exe',
bufsize=0,
universal_newlines=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
print ("id. proceso motor: ", engine.pid)
def put(comando):
print('\nTu:\n\t'+comando)
engine.stdin.write(comando+'\n')
def get():
# using the 'isready' command (engine has to answer 'readyok')
# to indicate current last line of stdout
engine.stdin.write('isready\n')
print('\nmotor:')
while True:
text = engine.stdout.readline().strip()
if text == 'readyok':
break
if text !='':
print('\t'+text)
get()
put('uci')
get()
put('setoption name Hash value 128')
get()
#put('setoption name nodestime value 500')
#get()
#put('setoption name Threads value 4')
#get()
put('ucinewgame')
get()
put(posic_uci)
get()
put('go infinite')
time.sleep(2)
get()
#put('stop')
#get()
#put('quit')
if __name__ == '__main__':
fen = 'r4rk1/pp2bppp/2n2n2/q3p1B1/2B3bN/1P2P3/P2N1PPP/2RQ1RK1 w - - 0 15'
t = threading.Thread(target=inicia_robot, args=(fen, ))
t.start()
#t.join()
He intentado matar el proceso (terminandose automaticamente el hilo) y sus hijos asi:
Código:
try:
if os.name != 'nt' # POSIX
os.kill(proceso_motor.pid, 9)
else: # WINDOWS
#import ctypes
#PROCESS_TERMINATE = 1
#handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
#ctypes.windll.kernel32.TerminateProcess(handle, -1)
#ctypes.windll.kernel32.CloseHandle(handle)
# por si acaso no mata los hijos
#st = subprocess.STARTUPINFO()
#st.dwFlags |= subprocess.STARTF_USESHOWWINDOW
DETACHED_PROCESS = 0x00000008 # para evitar que salga nada por la consola
subprocess.call(['taskkill', '/F', '/T', '/PID', str(proceso_motor.pid)], \
creationflags=DETACHED_PROCESS) #, startupinfo=st)
except OSError:
pass
finally:
if not proceso_motor.pid:
motor_activo = False
pero no me funciona bien. La mayor parte de las veces deja algun "hijo" colgando.
Una alternativa podría ser poder mandar una señal o evento externo al hilo con un comando tipo STOP para que pare el hilo (put('stop')), pero desde fuera del hilo. Aqui ando un poco perdido.
¿alguna idea?