web-dev-qa-db-fra.com

Multithread simple pour boucle en Python

J'ai cherché partout et je ne trouve aucun exemple simple d'itération d'une boucle avec multithreading.

Par exemple, comment puis-je multithreader cette boucle?

for item in range(0, 1000):
    print item

Existe-t-il un moyen de le couper comme 4 fils, de sorte que chaque fil a 250 itérations?

16
Anthony

Le moyen le plus simple est avec multiprocessing.dummy (qui utilise des threads au lieu des processus) et un Pool

import multiprocessing.dummy as mp 

def do_print(s):
    print s

if __name__=="__main__":
    p=mp.Pool(4)
    p.map(do_print,range(0,10)) # range(0,1000) if you want to replicate your example
    p.close()
    p.join()

Peut-être que vous voulez essayer de vrais multitraitements, si vous voulez mieux utiliser plusieurs processeurs, mais il y a plusieurs mises en garde et directives à suivre alors.

Peut-être que d'autres méthodes de Pool conviendraient mieux à vos besoins - selon ce que vous essayez réellement de faire.

11
janbrohl

Vous devrez effectuer le fractionnement manuellement:

import threading

def ThFun(start, stop):
    for item in range(start, stop):
        print item

for n in range(0, 1000, 100):
    stop = n + 100 if n + 100 <= 1000 else 1000
    threading.Thread(target = ThFun, args = (n, stop)).start()

Ce code utilise le multithreading , ce qui signifie que tout sera exécuté dans un seul processus Python (c'est-à-dire qu'un seul interprète Python le fera). être lancé).

Le multitraitement , discuté dans l'autre réponse, signifie l'exécution de code dans plusieurs interprètes Python (dans plusieurs processus , pas threads ) . Cela peut utiliser tous les cœurs de processeur disponibles, c'est donc utile lorsque vous vous concentrez sur la vitesse de votre code ( imprimez une tonne de chiffres jusqu'à ce que le terminal vous déteste! ), pas simplement sur le traitement parallèle. 1


1. multiprocessing.dummy Se révèle être n wrapper autour du module threading . multiprocessing et multiprocessing.dummy ont la même interface, mais le premier module effectue un traitement parallèle en utilisant processus , tandis que le dernier - en utilisant threads .

8
ForceBru