0

Est-il possible de lancer plusieurs threads sur toutes les CPU disponibles au lieu d'une seule? Un exemple de code serait génial.Comment faire face à une IO et une CPU liées en même temps dans le contexte du parallélisme?

Sinon, puis-je répartir plusieurs processus et ensuite créer un multi-threading dans chaque processus? J'utilise multithreading qui fonctionne bien pour le côté IO de mon script. Cependant, mon script est également coûteux en calcul donc je voudrais lancer plusieurs threads sur plusieurs processeurs.

Mon flux de code:

def worker(url): 
    extract url (io bound) 
    process url content (cpu bound) 

Quel devrait être le moyen efficace de traiter ce type de travailleur?

+0

Possible duplication de [Comprendre python GIL - I/O lié vs CPU lié] (https://stackoverflow.com/questions/23574367/understanding-python-gil-io-bound-vs-cpu-bound) – Netwave

+0

vous ne pouvez pas jeter un coup d'oeil à https://stackoverflow.com/a/1294402/1695172 – Netwave

+0

Vous devez utiliser le multitraitement pour cela en raison du GIL – Metareven

Répondre

1

Est-il possible de lancer plusieurs threads sur tous les processeurs disponibles au lieu d'un?

En général, les unités d'exécution s'exécutent sur tous les processeurs disponibles. Sauf si vous avez spécifié un thread/processus à exécuter sur un processeur spécifique. (Cela varie selon le système d'exploitation)

Cependant, si vous utilisez l'implémentation Python de python.org ("CPython"), cela n'a pas d'importance. CPython a un "Global Interpreter Lock" qui impose qu'un seul thread à la fois exécute le bytecode Python. L'utilisation de threads n'améliorera donc pas les performances de traitement avec CPython.

Par conséquent, pour les tâches coûteuses en termes de calcul, vous devez probablement utiliser le module multiprocessing pour le faire dans différents processus. Si le même travail est effectué sur beaucoup de données, l'utilisation d'un multiprocessing.Pool est généralement une bonne idée.