Нужно ли (и как) позаботиться о завершении работы нескольких потоков, которые тоже запущены из отдельного потока?

Для того чтобы корректно завершить работу нескольких потоков, запущенных из отдельного потока, в Python можно воспользоваться механизмом для работы с потоками из стандартной библиотеки threading.

Для управления жизненным циклом потоков можно использовать флаги или события. Например, можно создать флаг running, который будет указывать потокам, должны ли они продолжать выполнение. Когда нужно завершить работу всех потоков, можно установить флаг running в False, и потоки будут завершать свою работу.

Пример:

import threading
import time

def worker():
    while running:
        print("Working...")
        time.sleep(1)

running = True

threads = []
for _ in range(3):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

# Ждем какое-то время
time.sleep(5)

# Останавливаем потоки
running = False

for t in threads:
    t.join()

print("All threads stopped.")

В этом примере создаются три потока, каждый из которых выполняет функцию worker. Функция worker в цикле проверяет флаг running и останавливает свою работу, если флаг установлен в False. После некоторого времени флаг running устанавливается в False, после чего все потоки завершают свою работу и программа выводит сообщение "All threads stopped."

Таким образом, путем управления флагами или событиями можно элегантно завершить работу нескольких потоков, запущенных из отдельного потока.