Lorsque vous essayez d'utiliser pool.map() pour cibler une fonction avec plusieurs paramètres, y compris un objet Lock(), c'est crucial pour résoudre la question du partage du verrou entre les sous-processus. Le multiprocessing.Lock() conventionnel ne peut pas être transmis directement aux méthodes Pool en raison des limitations de décapage.
Une approche consiste à utiliser Manager() et instanciez un Manager.Lock(). Bien que cette méthode soit fiable, elle implique une surcharge plus importante en raison du processus supplémentaire qui héberge le serveur Manager. De plus, les opérations de verrouillage nécessitent une communication avec ce serveur via IPC.
Vous pouvez également transmettre le multiprocessing.Lock() régulier lors de l'initialisation du pool en utilisant l'argument du mot-clé d'initialisation. Cela garantit que l’instance de verrouillage est globale dans tous les travailleurs enfants. Cette méthode élimine la nécessité de fonctions partielles et rationalise le processus.
Voici un exemple utilisant l'option 2 :
<code class="python">def target(iterable_item): for item in items: # Do cool stuff if (... some condition here ...): lock.acquire() # Write to stdout or logfile, etc. lock.release() def init(l): global lock lock = l def main(): iterable = [1, 2, 3, 4, 5] l = multiprocessing.Lock() pool = multiprocessing.Pool(initializer=init, initargs=(l,)) pool.map(target, iterable) pool.close() pool.join()</code>
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!