Как я могу гарантировать, что поток Python умирает после завершения его целевой функции?


У меня есть служба, которая порождает потоки.
Потоки запускаются с помощью целевой функции.
Казалось бы, что поток не "умирает", когда функция заканчивается. Я знаю это, потому что поток делает некоторые SSH-соединения с Paramiko (через Fabric), и если я делаю 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)
1 2

1 ответ:

Вы уверены, что ваш модуль fabric выполняет ssh только на время выполнения команды ls. То есть, он должен делать эквивалент

Ssh хост ls-lht /tmp

Эта командная строка откроет удаленную оболочку для выполнения команды ls-lht, а затем завершит работу.

Но я подозреваю, что библиотека Fabric может делать эквивалент:

Ssh хост

Хост$ ls-lht /tmp . .

Конечно, это не обеспечивает реального tty, но есть различные варианты ssh это позволяет держать соединение открытым без интерактивного tty. Это было бы желательно в некоторых случаях (например, если вы выполняете много команд на одном хосте, этот метод будет повторно использовать существующий сеанс ssh вместо открытия нового сеанса каждый раз. Проверьте документацию для аргументов, чтобы включить или отключить такое кэширование сеанса.