Как я могу гарантировать, что поток Python умирает после завершения его целевой функции? - PullRequest
2 голосов
/ 17 октября 2011

У меня есть служба, которая порождает темы.
Потоки запускаются с помощью целевой функции.
Похоже, что поток не «умирает», когда функция заканчивается.Я знаю это, потому что поток устанавливает некоторые соединения 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 голосов
/ 17 октября 2011

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

ssh host ls -lht / tmp

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

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

хост ssh

host $ ls -lht / tmp , .

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

...