Ctrl-C для многопоточного скрипта Python - PullRequest
0 голосов
/ 30 мая 2019

Это на платформе cygwin.

Я пытаюсь использовать Ctrl-C для печати информации об ожидающих / активных потоках в скриптах python.На самом деле потоки - это ssh-вызовы (подпроцесс) к различным машинам Linux, которые выполняют различные задачи и могут занять произвольное количество времени (до 15 минут) для завершения и присоединения.

Я написал функцию обработчика сигнала, как показано нижечтобы напечатать информацию на первом Ctrl-C, и если я дважды нажимаю CTRL-C в течение 5 секунд, сценарий завершается.

Если сценарий выполняется долго, я могу проверить, какие ожидающие потоки (сеансы SSH)нажимая Ctrl-C.

Я пытаюсь упростить полный сценарий, чтобы вставить его сюда, но это немного сложно.Однако обработчик сигнала ниже.

Проблема в том, что эффект нажатия Ctrl-C немного случайный.Иногда это работает, как и ожидалось, но в других случаях дочерний поток по какой-то причине прерывается (не совсем точно) во время нажатия Ctrl-C, и это портит обработку.Не уверен, как / почему это происходит.В некоторых других случаях происходит сбой сценария.

Есть ли способ избежать отправки Ctrl-C в дочерний поток, и только родительский процесс обрабатывает его и вызывает функцию-обработчик?

Есть лидругой способ добиться того, что я пытаюсь сделать?Напечатайте некоторую информацию, пока основной поток ожидает на thread.join (несколько соединений).

#!/usr/bin/python3.7

from __future__ import print_function
import re, argparse, sys, subprocess, queue, threading, signal
from threading import Thread
from time import sleep

signal.signal(signal.SIGINT, keyboardInterruptHandler)
killCount=2

def keyboardInterruptHandler(signal, frame):
    global killCount, blahblah_to_print_info_about_active_threads
    if (killCount >= 2):
                print("Print Information about pending/active Threads", file=sys.stderr)
                sys.stderr.flush()
    killCount -= 1
    print("\nKILLCOUNT = %d" %killCount, file=sys.stderr)
    sys.stderr.flush()
    if (killCount <= 0):
        sys.exit("Killed by user")
    sleep(5)
    killCount=2
...