Как я могу гарантировать, что поток 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 ответ:
Вы уверены, что ваш модуль fabric выполняет ssh только на время выполнения команды ls. То есть, он должен делать эквивалент
Ssh хост ls-lht /tmp
Эта командная строка откроет удаленную оболочку для выполнения команды ls-lht, а затем завершит работу.
Но я подозреваю, что библиотека Fabric может делать эквивалент:
Ssh хост
Хост$ ls-lht /tmp . .
Конечно, это не обеспечивает реального tty, но есть различные варианты ssh это позволяет держать соединение открытым без интерактивного tty. Это было бы желательно в некоторых случаях (например, если вы выполняете много команд на одном хосте, этот метод будет повторно использовать существующий сеанс ssh вместо открытия нового сеанса каждый раз. Проверьте документацию для аргументов, чтобы включить или отключить такое кэширование сеанса.