スレッドを生成するサービスがあります。
スレッドは、ターゲット関数を提供することによって開始されます。
関数が終了しても、スレッドは「死ぬ」ことはないように見えます。これは、スレッドが( Fabricを介して) Paramikoと SSH 接続を行うためです。これを行うと、関数の完了後も SSH 接続がまだアクティブであることがわかります。
ターゲット関数が完了したときにスレッドが確実に終了するようにするにはどうすればよいですか?lsof
これが私が取り組んでいるものの例です:
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)