Problema con Semaforos

Problema con Semaforos

de Carlos Santiago Marquez Fumero -
Número de respuestas: 2
Cómo están?

Les cuento que tengo un problema con semaforos que detallo debajo.

1. Tengo un semaforo inicializado en 1

sem = Semaphore(1)

2. El mismo lo paso por parametro en un nuevo thread como se muestra debajo

Thread(name='nuvo hilo', target=target, args=(param1, sem, ), daemon = True).start()

3. En el momento que el hilo se ejecuta, el proceso queda colgado en el acquire() aunque sea el primer y único proceso que toma el semaforo. Si el código del proceso fuera el siguiente, nunca se imprime el contenido del segundo print()

print('antes sem')
sem.acquire()
print('dentro sem')

Me podrían ayudar a entender que estoy haciendo mal?

Gracias!
En respuesta a Carlos Santiago Marquez Fumero

Re: Problema con Semaforos

de Martin Giachino -
Se me ocurre que el problema está en el paso 2.

hay algo con los parámetros que no me cierra, por ejemplo tener una función que se llame "target". No es que no pueda llamarse así, pero me deja la duda de si entendieron bien los parametros que necesitan al crear el objeto Thread.

Otra cosa que se me ocurre es ver si es necesario pasar el semáforo como parámetro o no. Quizás si es una variable global no lo sea.
En respuesta a Martin Giachino

Re: Problema con Semaforos

de Carlos Santiago Marquez Fumero -
Gracias por la respuesta Martin!

Te cuento que el código que pasé es "descritptivo" en el codigo original, en target va el nombre de la función que tiene el código del thread. En cuanto a pasar el semaforo como variable es por que mi función está definida en un modulo llamado serverServices.py donde están todas las operaciones del server.

El trhead funciona correctamente ya que si el semaforo lo inicializo com 2 o 3 puedo acceder con ese mismo número de clientes sin que se detenga. Pero no sería lo correcto ya que se supone que solo un cliente puede acceder al mismo tiempo a la memoria compartida.

Me genera duda el definir mi semaforo como "global" voy a intentar con eso, ya que global es para que lo usen entre diferentes modulos...