Explication détaillée de l'exemple de code de fin de tâche du pool de threads Threadpool en python

高洛峰
Libérer: 2017-03-20 13:09:56
original
4194 Les gens l'ont consulté

Exigences

Nous devons traiter une série de chiffres simples (0~9). S'il s'agit d'un nombre impair, nous devons boucler pour l'imprimer ; nombre pair, attendez l'heure correspondante et terminez toutes les tâches ; si c'est 0, c'est une erreur, mais il n'est pas nécessaire de terminer la tâche et certains traitements peuvent être personnalisés.

Points clés

Définir la fonctionFonctionExigences de traitement

Le traitement de rappel renvoie des résultats, seuls les nombres pairs et 0 sont renvoyés. Les nombres impairs seront toujours exécutés ; ; le contrôle des threads est requis. Pool statut , vous devez lancer une exception pour un nombre pair et une fois 0 , et capturer gestion des exceptions .

Threadpool définit la concurrence du pool de threads

Impléments

# -*- coding: utf-8 -*-
from threadpool import makeRequests, ThreadPool
import time
from multiprocessing import Process
Copier après la connexion

Définition d'exception et définition de valeur spéciale (0)

class Finish(SyntaxWarning):
    pass
Copier après la connexion
class PauseInfo(SyntaxWarning):
    pass
pause_num = 0
Copier après la connexion

fonction func Définissez

pour renvoyer False lorsque 0, les autres nombres pairs renvoient True

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)
Copier après la connexion

définition de rappel

def callback(request, result):
    if result:
        raise Finish
    else:
        raise PauseInfo
Copier après la connexion

Traitement du pool de threads

Terminer indique que la tâche est terminée, induit à nouveau une exception et quitte le traitement du pool de threads

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
Copier après la connexion

La fonction principale démarre un processus de test

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)
Copier après la connexion
 
Copier après la connexion

Vérification des résultats

Traitement 108, vous pouvez le voir en imprimant vers, 1 est traité en boucle, et une erreur est signalée lorsque 0 est traité ; lorsque 8 est traité, la tâche se termine

Liste de numéros d'entrée à tester et n'importe quel autre mot pour arrêter
108
continuer pour 1
commencer pour 0 et attendre 4s
commencer pour 8 et attendre 8s
continuer pour 1
continuer pour 1
continuer pour 1
erreur bcs 0
continuer pendant 1
Pause bcs 0 mais continuera
continuer pendant 1
continuer pendant 1
continuer pendant 1
continuer pendant 1
arrêt pour 8
Saisissez la liste de numéros à tester et tout autre mot à quitter

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal