2017-05-24 4 views
0

Ich benutze Supervisor, um ein Skript wie folgt zu starten. Wenn der Supervisor gestoppt wird oder unterbrochen wird, versuche ich, das Skript ordnungsgemäß zu beenden. Dies ist meine aktuellen CodePython Process Pool Executor Herunterfahren auf Signal

import concurrent.futures 
import random 
import os 
import signal 
import sys 

executor = concurrent.futures.ProcessPoolExecutor(max_workers=2) 

some_flag = True 

def some_func(): 
    while some_flag: 
     executor.submit(print_some_num) 

def print_some_num(): 
    print("From worker :{}".format(os.getpid())) 
    print(random.randint(0,10)) 

def handler(arg1, arg2): 
    print("Got interrupt") 
    some_flag = False 
    sys.exit("Run for ur life") 
    #executor.shutdown(wait = False) ----> not working 
    print("Shutdown") 

signal.signal(signal.SIGTERM,handler) 
signal.signal(signal.SIGINT,handler) 

if __name__ == '__main__': 
    some_func() 

Dies funktioniert gut, und jetzt bin ich verwirrt, wenn ich über executor.shutdown lesen (wait = True/False). Also habe ich das versucht und ich konnte den Executor nicht herunterfahren (es hängt einfach). Bitte helfen Sie mir mit diesen Fragen aus

1) what does executor.shutdown do that sys.exit() doesn't do. 
2) What is advisable in production environment? If executor shutdown is required, please help me fix the issue with shutdown. 

Antwort

0

1) Offenbar Abschaltung stoppt alle vorhandenen Nachrichten verarbeitet werden, aber sys.exit() kommt gerade aus. (in der Dokumentation)

2) Wenn jemand an der gleichen Stelle stecken geblieben ist, verwenden Sie eine globale Variable, um das Herunterfahren zu signalisieren.

def some_func(): 
with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor: 
    while True: 
     global some_flag 
     print(some_flag) 
     if not some_flag: 
      executor.shutdown(wait=True) 
      sys.exit() 
     else: 
      executor.submit(print_some_num) 

def print_some_num(): 
    print("From worker :{}".format(os.getpid())) 
    print(random.randint(0,10)) 

def handler(arg1, arg2): 
    global some_flag 
    print("Got interrupt") 
    some_flag = False 
    print("Shutdown") 

signal.signal(signal.SIGTERM,handler) 
signal.signal(signal.SIGINT,handler) 
+0

Bitte fügen Sie Ihre Kommentare hinzu, wenn es besser gemacht werden kann. – Anandan

Verwandte Themen