2017-05-20 2 views
0

Gegeben zu handhaben, dass, wenn die folgenden Code wie folgt ausgeführt: „hallo“wie ein Signal

  • cli() einige Konfigurationsdateien
  • blabla() druckt eine Nachricht parst
  • diese 2 Funktionen sind die einzigen, die in main()
  • cli() ist auch der Signal-Handler von SIGUSR2

Hier wird das Snippet:

def cli(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument("--logger-file", dest="logger_file", required=True, help="YAML logging configuration file") 
    parser.add_argument("--conf-file", dest="conf_file", required=True, help="app configuration file") 
    args = parser.parse_args() 
    setup_logger(args.logger_file) 
    commit_conf(args.conf_file) 


def blabla(): 
    while True: 
     logger.info("hi!") 
     time.sleep(60) 


def recv_sigusr2(signum, stack): 
    cli() 

def main(): 
    cli() 
    signal.signal(signal.SIGUSR2, recv_sigusr2) 
    blabla() 


if __name__ == "__main__": 
    main() 

Die Frage ist:

  1. warum blabla() läuft jedes Mal, wenn ich sendin g SIGUSR2 signal, da nur der Signal-Handler nur cli() aufruft?
  2. wie läuft nur cli() erreicht werden kann (ohne blabla() anrufen)?

Antwort

0

Python doc sagt über time.sleep(secs):

die Ausführung des aktuellen Threads für die vorgegebene Anzahl von Sekunden. Das Argument kann eine Fließkommazahl sein, um eine genauere Schlafzeit anzuzeigen. Die tatsächliche Aussetzzeit kann kleiner als die angeforderte sein, da jedes gefangene Signal den Schlafmodus() nach der Ausführung der Fangroutine dieses Signals beendet. Außerdem kann die Aussetzungszeit wegen der Einplanung anderer Aktivitäten in dem System länger als gewünscht um einen willkürlichen Betrag sein.

So blabla wird nicht jedes Mal aufgerufen, wenn SIGUSR2 empfangen wird, aber eine weitere Iteration der Schleife beginnt sofort, wegen sleep Unterbrechung.

Verwandte Themen