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 de 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() normal 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 :
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()
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3