我有一个完整的“工作”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
,实际上阻塞了主程序。解决办法就是去掉括号:
t = threading.Thread(target=handler.run)