python - ターゲット関数が完了した後にPythonスレッドが確実に終了するようにするにはどうすればよいですか?

原文 python fabric paramiko python-multithreading

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

これが私が取り組んでいる例です:

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)
答え
ファブリックモジュールがlsコマンドの間だけsshを実行していることを確認しますか?つまり、それは同等のことをしているはずです

sshホストls -lht / tmp

このコマンドラインは、リモートシェルを開いてls -lhtコマンドを実行してからシャットダウンします。

しかし、Fabricライブラリは以下と同等のことをしているのではないかと思います。

sshホスト

host $ ls -lht / tmp



もちろん、本当のttyを提供していませんが、対話型ttyなしで接続を開いたままにできるsshオプションがいくつかあります。これは、特定の場合に望ましいでしょう(たとえば、同じホストで多数のコマンドを実行する場合、この手法は、毎回新しいセッションを開くのではなく、既存のsshセッションを再利用します。このようなセッションキャッシングを有効または無効にする引数については、ドキュメントを確認してください。
関連記事

python - django / python:複数のテーブルを持つ生のSQL

python - ブレンダーは頂点ごとのUV座標をエクスポートできますか?

python - Pythonのインタラクティブ(注釈付き)チャート[終了]

python - Makoマクロのオプションとして「クラス」を使用する

python - 「pip install」と「setup.py install」での最大再帰[終了]

python - ウェルカムテキストを表示するにはどうすればよいですか?

python - 新しいインタープリターセッションを開始せずに、編集のためにIDLEで.pyファイルを開くにはどうすればよいですか?

python - Django / Pythonを使用して既存のWebサービスを利用する

python - python.socketのどの部分が、タイムアウトが設定されていても、スクリプトをいつまでもフリーズさせる可能性がありますか?

python - 隣接行列を使用したPythonでのグラフの色分け