我有一个完整的“工作”python代码,它应该包含两个同时运行的线程,它们填充字典中的某些列表,当用户按下 CRTL-C 时,这两个线程应该停止,并且两个线程的一些输出应该写入文件:
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)
但是,此代码在打印完第一行后会阻塞执行debug1
。如何“解除阻塞”此行,以便启动两个线程,直到用户按下 CRTL-C(并将输出保存到文件)?
...上述代码只是一个更复杂代码的模板,它实际上可以做一些有用的事情......
除了各种拼写错误(忘记
import json
和threads=[]
)之外,主要问题在于t = threading.Thread(target=handler.run())
。参数
target
应为函数对象,而不是该函数调用的结果。此处的代码立即调用永不结束的函数,将其永不结束的结果赋值给t
,实际上阻塞了主程序。解决方法就是删除括号: