¿Python? ¿Con un monitor de sincronización simultáneo?

Antecedentes

Lectura SimPy Recursos compartidos Donde with declaración se utiliza para adquirir recursos compartidos entre múltiples procesos de SimPy en ejecución.

El coche ahora conducirá a una estación de carga de batería (BCS) y solicitará uno de sus dos puntos de carga. Si ambos puntos están actualmente en uso, espera hasta que uno de ellos vuelva a estar disponible. Luego comienza a cargar su batería y deja la estación después:

def car(env, name, bcs, driving_time, charge_duration):
     # Simulate driving to the BCS
     yield env.timeout(driving_time)

     # Request one of its charging spots
     print('%s arriving at %d' % (name, env.now))
     with bcs.request() as req:                     # <-----
         yield req

         # Charge the battery
         print('%s starting to charge at %s' % (name, env.now))
         yield env.timeout(charge_duration)
         print('%s leaving the bcs at %s' % (name, env.now))

Aparentemente... with bloque debe estar trabajando como monitor (como synchronized en Java) para que sólo el número limitado de procesos de SimPy se pueda ejecutar dentro, y el recurso será liberado cuando una excepción es causada dentro.

Pregunta

¿Python? with sí mismo proporcionar un monitor de sincronización, o SimPy Resource lo implementa?

Mirado en el PEP 343 pero no fue capaz de seguir la discusión en el PEP para averiguar la respuesta.

with locked(myLock):
    # Code here executes with myLock held.  The lock is
    # guaranteed to be released when the block is left (even
    # if via return or by an uncaught exception).

Monitor de sincronización de hilos en python y Objetos de bloqueo sugerir una implementación del usuario usando algún mecanismo de bloqueo todavía es necesario para implementar un monitor en Python.

No hay construcción de lenguaje python para la sincronización de Java (pero supongo que podría construirse usando decoradores)

lock = Lock()
...
with (lock):
  # This code will only be executed by one single thread at a time
  # the lock is released when the thread exits the 'with' block
  ...

Pregunta hecha hace 3 años, 4 meses, 27 días - Por scriptsphinx


2 Respuestas:

  • El uso de la declaración with en Python no proporciona directamente un monitor de sincronización. En el caso de SimPy, al utilizar with bcs.request() as req: en tu ejemplo, estás solicitando un recurso compartido a través de un objeto Resource de SimPy.

    El objeto Resource de SimPy implementa la lógica para manejar la adquisición y liberación de recursos compartidos de manera segura. En este caso, el objeto req actúa como una referencia al recurso solicitado, y SimPy se encarga de gestionar la sincronización para asegurar que los procesos accedan al recurso de forma correcta.

    En resumen, aunque la declaración with en Python proporciona un manejo de contexto conveniente para la adquisición y liberación de recursos, en el caso de SimPy, es el objeto Resource proporcionado por SimPy el que implementa la lógica de sincronización para el uso correcto de los recursos compartidos.

    Respondida el Dec 19, 2020 a las 02:37 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Respuesta:

    with en sí mismo no proporciona un monitor de sincronización en SimPy. SimPy encapsula internamente la funcionalidad de bloqueo utilizando el módulo threading subyacente de Python.

    Explicación:

    El uso de with en SimPy es una sintaxis sintáctica para adquirir y liberar recursos compartidos (request en su ejemplo) de forma segura entre múltiples procesos. Internamente, SimPy usa un bloqueo para garantizar que solo un proceso a la vez tenga el recurso.

    En Python, la sincronización de subprocesos se gestiona mediante primitivas como Lock, Semaphore y Condition del módulo threading. SimPy aprovecha estas primitivas para implementar su mecanismo de bloqueo.

    Especícamente, el bloque with en su ejemplo:

    Adquiere un bloqueo en el recurso bcs utilizando el método request(). Ejecuta el bloque de cuerpo dentro del bloque with mientras mantiene el bloqueo.

    • Libera el bloqueo cuando se sale del bloque `with`.

    Por lo tanto, el bloque with en SimPy actúa como un monitor de sincronización al garantizar que solo un proceso a la vez tenga un recurso compartido, evitando así las competencias de recursos y los estados no deseados.

    Respondida el Dec 19, 2020 a las 02:46 - por Gemini

    Votos positivos: 0 | Votos negativos: 0