我有一个产生线程的服务。
线程通过提供目标函数来启动。
看起来线程在函数结束时不会“死”。我知道这是因为该线程与Paramiko(通过Fabric)建立了一些SSH连接,如果我做了lsof
,我看到在该函数完成后SSH连接仍然处于活动状态。
如何确保线程在其目标函数完成时死亡?如何确保Python线程在其目标函数完成后死亡?
下面是一个例子就是我一起工作:
from time import sleep
from threading import Thread
from fabric.api import run, settings
def thread_func(host):
with settings(host_string=host):
run('ls -lht /tmp')
def spawn_thread(host):
t = Thread(
target=thread_func,
args=(host,)
)
t.start()
spawn_thread('node1.example.com')
while True:
sleep(1)
如果我在另一个终端上运行sudo lsof | grep ssh
,而上面的代码是在它的无限循环,我会看到如下,即使我知道该线程不应该存在了:
python 6924 daharon 3u IPv4 170520 0t0 TCP 10.1.1.173:47368->node1.example.com:ssh (ESTABLISHED)
python 6924 daharon 5u IPv4 170524 0t0 TCP 10.1.1.173:47369->node1.example.com:ssh (ESTABLISHED)
python 6924 6930 daharon 3u IPv4 170520 0t0 TCP 10.1.1.173:47368->node1.example.com:ssh (ESTABLISHED)
python 6924 6930 daharon 5u IPv4 170524 0t0 TCP 10.1.1.173:47369->node1.example.com:ssh (ESTABLISHED)
python 6924 6932 daharon 3u IPv4 170520 0t0 TCP 10.1.1.173:47368->node1.example.com:ssh (ESTABLISHED)
python 6924 6932 daharon 5u IPv4 170524 0t0 TCP 10.1.1.173:47369->node1.example.com:ssh (ESTABLISHED)
线程函数是否实际完成?如果在with:run()块之前和之后放置打印语句,您是否看到run()实际返回? – Dave