Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Beispielcodes für die Threadpool-Task-Beendigung in Python

Detaillierte Erläuterung des Beispielcodes für die Threadpool-Task-Beendigung in Python

高洛峰
高洛峰Original
2017-03-20 13:09:564192Durchsuche

Anforderungen

Wir müssen eine Reihe einzelner Ziffern (0~9) verarbeiten. Wenn es sich um eine ungerade Zahl handelt, müssen wir eine Schleife ausführen , um sie zu drucken gerade Zahl, warten Sie auf die entsprechende Zeit und schließen Sie alle Aufgaben ab. Wenn es 0 ist Es ist ein Fehler, aber es besteht keine Notwendigkeit, die Aufgabe zu beenden, und einige Verarbeitungen können angepasst werden.

Wichtige Punkte

Funktion definierenFunktionVerarbeitungsanforderungen

Die Rückrufverarbeitung gibt Ergebnisse zurück, es werden immer nur gerade Zahlen und 0 zurückgegeben ; Thread-Kontrolle ist erforderlich Pool Status , Sie müssen eine Ausnahme für eine gerade Zahl und 0 Mal auslösen und Ausnahmebehandlung erfassen.

Threadpool definiert Thread-Pool-Parallelität

Implementiert

# -*- coding: utf-8 -*-
from threadpool import makeRequests, ThreadPool
import time
from multiprocessing import Process

Ausnahmedefinition und Sonderwertdefinition (0)

class Finish(SyntaxWarning):
    pass
class PauseInfo(SyntaxWarning):
    pass
pause_num = 0

Funktionsfunktion Definieren Sie

so, dass bei 0 False zurückgegeben wird, andere gerade Zahlen geben True zurück

def func(para):
    if para == pause_num:
        print('start for %d and wait %ds' % (para, 4))
        time.sleep(4)
        print('error bcs ',para)
        return False
    if para % 2 == 0:
        print('start for %d and wait %ds' % (para, para))
        time.sleep(para)
        print('stop for', para)
        return True
    while True:
        print('continue for', para)
        time.sleep(para)

Rückrufdefinition

def callback(request, result):
    if result:
        raise Finish
    else:
        raise PauseInfo

Thread-Pool-Verarbeitung

Finish zeigt dies an die Aufgabe ist abgeschlossen, löst erneut eine Ausnahme aus und beendet die Thread-Pool-Verarbeitung;

def main_thread(paras):
    pool = ThreadPool(10)
    requests = makeRequests(callable_=func, args_list=paras, callback=callback)
    [pool.putRequest(req) for req in requests]
    while True:
        try:
            pool.wait()
        except Finish as e:
            raise SystemExit
        except PauseInfo as e:
            print('Pause bcs %d but will continue' % pause_num)
        except Exception as e:
            print('Unknown error so will quit')
            raise SystemExit

Die Hauptfunktion startet einen Testprozess

if name == 'main':
    while True:
        s = input('Input number list to test and any other word to quit\n')
        paras = []
        for para in s:
            if para.isnumeric():
                paras.append(int(para))
            else:
                break
        try:
            thread_test = Process(target=main_thread, args=(paras,))
            thread_test.start()
            thread_test.join(timeout=20)
        except TimeoutError as e:
            print('task timeout')
        except Exception as e:
            print('unknow error:',e)
 

Ergebnisüberprüfung

Verarbeitung 108, Sie können es durch Drucken sehen, 1 wird in einer Schleife verarbeitet, und ein Fehler wird gemeldet, wenn 0 verarbeitet wird; wenn 8 verarbeitet wird, endet die Aufgabe

Eingabenummernliste zum Testen und irgendein anderes Wort zum Aufhören
108
weiter für 1
beginne mit 0 und warte 4 Sekunden
beginne mit 8 und warte 8 Sekunden
weiter mit 1
weiter mit 1
weiter mit 1
Fehler bcs 0
weiter für 1
Pause bcs 0, wird aber fortgesetzt
weiter für 1
weiter für 1
weiter für 1
weiter für 1
Stopp für 8
Geben Sie die Nummernliste zum Testen und ein beliebiges anderes Wort zum Beenden ein

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Beispielcodes für die Threadpool-Task-Beendigung in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn