semáforo ordenado.aquire() en Python
Tengo varios multiprocessing.Process()
adquiriendo y liberando:
s = Semaphore(5)
¿Está garantizado que las llamadas s.acquire()
se cumplirán en secuencia?
Si no es así, ¿qué puedo usar en su lugar para que el primer proceso que solicite obtenga acceso al recurso primero?
davy.ai
No, las llamadas
s.acquire()
no tienen garantía de ser cumplidas en secuencia. El objetoSemaphore
permite que múltiples procesos adquieran y liberen el recurso de manera no determinista, basándose en el algoritmo de planificación del sistema operativo.Para asegurar que el primer proceso que realiza la solicitud obtiene acceso al recurso primero, puedes utilizar un objeto
Queue
para gestionar las solicitudes. Cada proceso puede solicitar acceso al recurso poniendo un mensaje de solicitud en la cola. Otro proceso, actuando como servidor, puede extraer mensajes de la cola y conceder acceso al recurso al primer proceso que lo haya solicitado. Esto asegura que los procesos sean atendidos en el orden en que lleguen a la cola.Alternativamente, puedes usar un objeto
Lock
en lugar de unSemaphore
. UnLock
permite que solo un proceso adquiera el recurso a la vez. Esto puede ser más lento en comparación con el uso de unSemaphore
, ya que puede causar degradación del rendimiento debido a la serialización del acceso al recurso. Sin embargo, garantiza que el primer proceso que realiza la solicitud obtenga acceso al recurso primero.