Un programa que crea varios procesos que funcionan en una cola que se puede unir Q
, y que eventualmente puede manipular un diccionario global D
para almacenar resultados. (por lo que cada proceso hijo puede usar D
para almacenar su resultado y también ver qué resultados están produciendo los otros procesos secundarios)
Si imprimo el diccionario D en un proceso hijo, veo las modificaciones que se han realizado en él (es decir, en D). Pero después de que el proceso principal se une a Q, si imprimo D, ¡es un dict vacío!
Entiendo que es un problema de sincronización / bloqueo. ¿Alguien puede decirme qué está sucediendo aquí y cómo puedo sincronizar el acceso a D?
Respuestas:
Una respuesta general implica usar un
Manager
objeto. Adaptado de los documentos:Salida:
fuente
multiprocessing.Manager()
devuelve una instancia deSyncManager
, cuyo nombre sugiere tanto!Manager
pero aún no tuve suerte. ¿Podría echar un vistazo a mi pregunta aquí y ver si puede ofrecer una solución? Aún puedo obtener diferentes números aleatorios si lo hagonp.random.seed(None)
cada vez que genero un número aleatorio, pero esto no me permite usar el estado aleatorio del proceso principal, que no es lo que quiero. Cualquier ayuda es muy apreciada.multiprocesamiento no es como enhebrar. Cada proceso hijo obtendrá una copia de la memoria del proceso principal. Generalmente, el estado se comparte a través de comunicación (tuberías / enchufes), señales o memoria compartida.
El multiprocesamiento hace que algunas abstracciones estén disponibles para su caso de uso: estado compartido que se trata como local mediante el uso de proxies o memoria compartida: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Secciones relevantes:
fuente
Me gustaría compartir mi propio trabajo que es más rápido que el dictado de Manager y es más simple y más estable que la biblioteca pyshmht que usa toneladas de memoria y no funciona para Mac OS. Aunque mi dictado solo funciona para cadenas simples y actualmente es inmutable. Uso la implementación de sondeo lineal y almaceno pares de claves y valores en un bloque de memoria separado después de la tabla.
En mi computadora portátil, los resultados de rendimiento son:
ejemplo de uso simple:
fuente
Además de @ senderle's here, algunos también podrían preguntarse cómo usar la funcionalidad de
multiprocessing.Pool
.Lo bueno es que hay un
.Pool()
método para lamanager
instancia que imita toda la API familiar del nivel superiormultiprocessing
.Salida:
Este es un ejemplo ligeramente diferente en el que cada proceso simplemente registra su ID de proceso en el
DictProxy
objeto globald
.fuente
Tal vez puedas probar pyshmht , que comparte la extensión de la tabla hash basada en memoria para Python.
aviso
No está completamente probado, solo para su referencia.
Actualmente carece de mecanismos lock / sem para multiprocesamiento.
fuente