J'ai un générateur de python qui retourne beaucoup d'articles, par exemple: 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)
4 Réponses :
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> si vous voulez obtenir les résultats " do_something "retour à nouveau, facile! p> 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
Vous avez les importations complètement en arrière. MultiProcessing.damy.pool Code> est une piscine à base de thread, pas un pool à base de processus et
multiprocessing.pool code> est basé sur le processus, non basé sur le thread.
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)
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.
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. " I>
P>
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 B> P>
J'ai préparé un exemple, pouvez-vous vérifier?
Oui, ça va :)
Merci, je vais regarder comme asyncio
Comme @Hele mentionné, ASYNCIO est le meilleur de tous, voici un exemple
['CHABCGDD', 'ACBGAFEB', ...
Merci! Je vais tester et comparer
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> à < Code> Rendement de la carte ("" .Join, iTerTools.Produits (caractères, répétez = 10)) code> 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 code> 'S
tuple code> s est publié avant la demande de la suivante, ce qui lui permet de réutiliser le
tuple code> plutôt que d'attribuer de nouveaux).
Merci pour le conseil!