Tenho um código Python "funcional" completo que supostamente contém duas threads que são executadas simultaneamente, que preenchem algumas listas em um dicionário e, quando o usuário pressiona CRTL-C, essas duas threads devem ser interrompidas e alguma saída de ambas as threads deve ser gravada em um arquivo:
import sys
import time
import threading
import signal
from functools import partial
messages = {}
lock = threading.Lock()
class Handler:
def __init__(self, port):
self.port = port
def run(self):
while True:
time.sleep(1)
with lock:
messages[self.port].append(time.time())
def signal_handler(filename, sig, frame):
with lock:
with open(filename, "w") as fileout:
json.dump(messages, fileout)
sys.exit(0)
output = "test.out"
signal.signal(signal.SIGINT, partial(signal_handler, output))
for port in [1,2]:
messages[port] = []
handler = Handler(port)
print("debug1")
t = threading.Thread(target=handler.run())
print("debug2")
t.daemon = True
t.start()
threads.append(t)
# Keep the main thread running, waiting for CTRL-C
try:
while True:
pass
except KeyboardInterrupt:
signal_handler(output, signal.SIGINT, None)
No entanto, esse código bloqueia a execução após a primeira debug1
ter sido impressa. Como "desbloquear" essa linha para que os dois threads sejam iniciados até que o usuário pressione CRTL-C (e a saída seja salva em um arquivo)?
...O código acima é apenas um modelo de um código mais complicado que realmente faz algo útil...
Além de vários erros de digitação (esquecidos
import json
ethreads=[]
), o principal problema está emt = threading.Thread(target=handler.run())
.Espera-se que o
target
parâmetro seja um objeto de função, não o resultado da chamada dessa função. Aqui, esse código imediatamente chama a função never ending para atribuir seu resultado never coming at
, bloqueando, na verdade, o programa principal.A solução é simplesmente remover os pais: