0
votes

Python multiples processus consommant / itération sur un seul générateur (division et conquérir)

J'ai un générateur de python qui retourne beaucoup d'articles, par exemple: xxx pré>

i, puis itérale sur cette question et effectuer diverses tâches, le problème est que je n'utilise qu'un seul fil / Processus pour cela: P>

my_strings = generate_random_strings()
for string in my_strings:
    # do something with string...
    print(string)


2 commentaires

Note latérale à la vitesse: elle ne fera pas une énorme différence, mais si vous changez pour l'élément dans iteroTools.Product (caractères, répétez = 10): Rendement "" .join (article) à < Code> Rendement de la carte ("" .Join, iTerTools.Produits (caractères, répétez = 10)) Il produira des résultats modérément plus rapides (en appuyant sur tout le travail sur la couche C, en supprimant l'interpréteur de bytecode, et par Assurer produit 'S tuple s est publié avant la demande de la suivante, ce qui lui permet de réutiliser le tuple plutôt que d'attribuer de nouveaux).


Merci pour le conseil!


4 Réponses :


0
votes

Solution la plus simple avec le moins de code? Gestionnaire de contexte multiprocessionnant.

Je suppose que vous pouvez mettre "faire quelque chose avec une chaîne" dans une fonction appelée "do_something" p> xxx pré>

si vous voulez obtenir les résultats " do_something "retour à nouveau, facile! p> xxx pré>

Vous les obtiendrez dans une liste. p>

multiprocessing.damy est une enveloppe syntaxique pour les piscines de traitement qui permet Vous utilisez la syntaxe multiprocessionnaire. Si vous voulez des threads au lieu de processus, faites cela: P>

from multiprocessing.dummy import Pool as ThreadPool


1 commentaires

Vous avez les importations complètement en arrière. MultiProcessing.damy.pool est une piscine à base de thread, pas un pool à base de processus et multiprocessing.pool est basé sur le processus, non basé sur le thread.



0
votes

Vous pouvez utiliser multiprocessionnaire code>.

import multiprocessing

def string_fun(string):
    # do something with string...
    print(string)

my_strings = generate_random_strings()
num_of_threads = 7
pool = multiprocessing.Pool(num_of_threads)
pool.map(string_fun, my_strings)


5 commentaires

Ce code ne transmettra-t-il qu'une seule chaîne par processus? Serait-ce plus rapide si nous devions passer une partie de cela? J'essaie juste d'envelopper ma tête autour de cela.


@Loicduros selon les documents, cela fait exactement cela - "Cette méthode côtelettes les ierables dans un certain nombre de morceaux qu'elle soumet au pool de processus comme tâches distinctes." ( docs.python.org/3.4 / Bibliothèque / ... )


OK, merci et que si le générateur a donné un gigantesque nombre d'articles, il faudrait-il "lire" celui-ci afin d'exécuter la piscine.map


La raison pour laquelle je demande est parce que lorsque je n'utilise que 4 caractères des permutations, il est en réalité émise des trucs de string_fun, mais si je passe aux nombres plus élevés, il semble que c'est bloqué.


Nevermind Ceci est dû à la génération_strings quand même.



0
votes

En supposant que vous utilisiez la dernière version de Python, vous voudrez peut-être lire quelque chose sur le module ASYNCIO. Multithreading n'est pas facile à mettre en œuvre en raison de la verrouillage de gil: "dans CPPHON, le verrouillage de l'interprète global, ou GIL, est un mutex qui protège l'accès aux objets Python, empêchant ainsi les threads multiples d'exécuter des bytecodes de python à la fois. Ce verrou est nécessaire. principalement parce que la gestion de la mémoire de CPPHON n'est pas du thread-coffre-fort. "

Vous pouvez donc échanger sur la multi-presse ou, comme indiqué ci-dessus, jetez un coup d'œil au module ASYCIO.
ASYNCIO - E / S asynchrone> https://docs.python.org/3/Library /asyncio.html

Je vais intégrer cette réponse avec du code dès que possible.
J'espère que ça vous aide,
HELE


3 commentaires

J'ai préparé un exemple, pouvez-vous vérifier?


Oui, ça va :)


Merci, je vais regarder comme asyncio



0
votes

Comme @Hele mentionné, ASYNCIO est le meilleur de tous, voici un exemple

STRY> P>

['CHABCGDD', 'ACBGAFEB', ...


1 commentaires

Merci! Je vais tester et comparer