如何在Python中以无阻塞的方式使用“线程”?

问题描述 投票:0回答:1

我有一个完整的“工作”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(并且输出保存到文件中)?

...上面的代码只是一个更复杂的代码的模板,实际上做了一些有用的事情...

python multithreading
1个回答
0
投票

除了各种错别字(忘记了

import json
threads=[]
),主要问题在于
t = threading.Thread(target=handler.run())

target
参数应该是一个函数对象,而不是该函数的调用结果。这里,这段代码立即调用永无止境的函数,将其永远不会到来的结果分配给t
,实际上阻塞了主程序。

解决办法就是去掉括号:

t = threading.Thread(target=handler.run)
    
© www.soinside.com 2019 - 2024. All rights reserved.