6

Ich bin gerade auf Python3 als Folge seiner Concurrent-Futures-Modul weitergegangen. Ich habe mich gefragt, ob ich Fehler erkennen könnte. Ich möchte Parallel-Futures zum Parallelprogramm nutzen, wenn es effizientere Module gibt, lassen Sie es mich wissen.Wie erkennt man Exceptions in concurrent.futures in Python3?

Ich mag keine Multiprozessing, da es zu kompliziert ist und nicht viel Dokumentation aus ist. Es wäre aber toll, wenn jemand eine Hello World ohne Klassen schreiben könnte, nur Funktionen, die Multiprocessing verwenden, um parallel zu berechnen, so dass es leicht zu verstehen ist.

Hier ist ein einfaches Skript:

from concurrent.futures import ThreadPoolExecutor 

def pri(): 
    print("Hello World!!!") 

def start(): 
    try: 
     while True: 
      pri() 
    except KeyBoardInterrupt: 
     print("YOU PRESSED CTRL+C") 


with ThreadPoolExecutor(max_workers=3) as exe: 
    exe.submit(start) 

Der obige Code war nur eine Demo, wie STRG + C wird nicht den satement drucken arbeiten.

Was ich will ist eine Funktion aufrufen zu können, ist ein Fehler vorhanden. Diese Fehlererkennung muss von der Funktion selbst stammen.

Ein weiteres Beispiel

import socket 
from concurrent.futures import ThreadPoolExecutor 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
def con(): 
    try: 
     s.connect((x,y)) 
     main() 
    except: socket.gaierror 
     err() 
def err(): 
    time.sleep(1) 
    con() 
def main(): 
    s.send("[+] Hello") 
with ThreadPoolExecutor as exe: 
    exe.submit(con) 
+0

So Sie fangen wollen 'KeyboardInterrupt '? Ist das was du fragst? – laike9m

+0

Was ist deine Frage? – laike9m

+0

Sie möchten "YOU PRESSED CTRL + C" drucken? – laike9m

Antwort

2

Here ist eine Lösung. Ich bin mir nicht sicher, ob dir das gefällt, aber ich kann mir keinen anderen vorstellen. Ich habe Ihren Code geändert, damit er funktioniert.

from concurrent.futures import ThreadPoolExecutor 
import time 

quit = False 

def pri(): 
    print("Hello World!!!") 

def start(): 
    while quit is not True: 
     time.sleep(1) 
     pri() 

try: 
    pool = ThreadPoolExecutor(max_workers=3) 
    pool.submit(start) 

    while quit is not True: 
     print("hei") 
     time.sleep(1) 
except KeyboardInterrupt: 
    quit = True 

Hier sind die Punkte:

  1. Wenn Sie with ThreadPoolExecutor(max_workers=3) as exe, es wartet, bis alle Aufgaben erledigt wurden. Werfen Sie einen Blick auf Doc

    Wenn wait wahr ist, dann wird diese Methode nicht zurück, bis alle ausstehenden Futures erfolgt die Ausführung und die mit dem Testamentsvollstrecker verbundenen Ressourcen wurden befreit. Wenn wait False ist, wird diese Methode sofort zurückkehren und die dem Executor zugeordneten Ressourcen werden freigegeben, wenn alle ausstehenden Futures ausgeführt werden. Unabhängig vom Wert von wait wird das gesamte Python-Programm erst beendet, wenn alle ausstehenden Futures ausgeführt wurden.

    können Sie vermeiden, diese Methode explizit aufrufen zu müssen, wenn Sie die with Anweisung verwenden, das wird Abschaltung der Executor (Warte als ob Executor.shutdown() mit Wartesatz True genannt wurden)

    Es ist wie join() auf einen Aufruf Faden.
    Deshalb habe ich es mit Fassung:

    pool = ThreadPoolExecutor(max_workers=3) 
    pool.submit(start) 
    
  2. Haupt Thread muss tun „Arbeit“ zu sein, um ein Ctrl + C zu fangen. So können Sie nicht nur Hauptthread verlassen da und Ausgang, der einfachste Weg ist eine Endlosschleife

  3. Jetzt laufen, dass Sie eine Schleife haben in Haupt-Thread ausgeführt wird, wenn sie getroffen werden CTRL+C, Programm geben Sie den except KeyboardInterrupt Block und Set quit=True. Dann kann Ihr Worker-Thread beendet werden.

Genau genommen ist dies nur ein Workaround. Es scheint mir unmöglich, einen anderen Weg dafür zu haben.

bearbeiten
Ich bin nicht sicher, was Sie stört, aber man kann ohne Probleme Ausnahme in einem anderen Thread fangen:

import socket 
import time 
from concurrent.futures import ThreadPoolExecutor 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

def con(): 
    try: 
     raise socket.gaierror 
     main() 
    except socket.gaierror: 
     print("gaierror occurred") 
     err() 

def err(): 
    print("err invoked") 
    time.sleep(1) 
    con() 

def main(): 
    s.send("[+] Hello") 

with ThreadPoolExecutor(3) as exe: 
    exe.submit(con) 

Ausgabe

gaierror occurred 
err invoked 
gaierror occurred 
err invoked 
gaierror occurred 
err invoked 
gaierror occurred 
... 
+0

Nein, leider ist das nicht was ich brauche. Ich muss Ausnahmen von der Funktion selbst abfangen. Aber das verdient eine Erwähnung. Könnte python2.7 mein Problem lösen? –

+0

"Ausnahmen fangen"! = "Catch ctrl + c". Wenn Sie eine Tastaturunterbrechung bekommen wollen, fürchte ich, das ist der einzige Weg. – laike9m

+0

Ich möchte einen Sockel gai Fehler –