es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python3 multiprocesamiento o hilos para utilizar los métodos getter/setter en paralelo.

Digamos que tengo clases donde defino atributos como getter/setter. Las clases son como esta:

class TestClass:
    def __init__(self):
        self.name = "nombre predeterminado"

    @property
    def myname(self):
        self._myname = self.name
        return self._myname

    @myname.setter
    def myname(self, n):
        self._myname = n
        self.name = self._myname

Instancio estas clases. En este ejemplo, instancio varias veces la misma clase:

a = TestClass()
a.myname = "A"
b = TestClass()
b.myname = "B"

Establecer y obtener estos nombres requiere cierta cantidad de tiempo.

¿Cómo puedo obtener en paralelo a.myname y b.myname?
¿Cómo puedo establecer en paralelo a.myname = "nuevo A" y b.myname = nuevo B?

Los ejemplos que he visto aquí, aquí, aquí y aquí con multiprocessing y multithreading solo involucran funciones o métodos de clase estándar.
Además, una solución basada en ray aparentemente no permite acceder a los atributos de la clase.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener a.myname y b.myname en paralelo, puedes utilizar la biblioteca concurrent.futures. Aquí tienes un ejemplo:

    import concurrent.futures
    
    a = TestClass()
    a.myname = "A"
    b = TestClass()
    b.myname = "B"
    
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # Envía las llamadas a las funciones y almacena los futuros
        future_a = executor.submit(a.myname)
        future_b = executor.submit(b.myname)
    
        # Espera a que los futuros se completen y obtén los resultados
        result_a = future_a.result()
        result_b = future_b.result()
    
    print(result_a, result_b) # Imprime "A B"
    

    Para establecer a.myname = "new A" y b.myname = "new B" en paralelo, puedes modificar el ejemplo anterior de la siguiente manera:

    import concurrent.futures
    
    a = TestClass()
    a.myname = "A"
    b = TestClass()
    b.myname = "B"
    
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # Envía la llamada a la función y almacena el futuro para a
        future_a = executor.submit(a.myname.setter, "new A")
    
        # Envía la llamada a la función y almacena el futuro para b
        future_b = executor.submit(b.myname.setter, "new B")
    
        # Espera a que los futuros se completen
        future_a.result()
        future_b.result()
    
    print(a.myname, b.myname) # Imprime "new A new B"
    

    Ten en cuenta que en ambos ejemplos estamos utilizando ThreadPoolExecutor de la biblioteca concurrent.futures para ejecutar las llamadas a las funciones en paralelo. También estamos utilizando la función submit() para enviar las llamadas a las funciones y obtener un futuro, que podemos utilizar para esperar y obtener los resultados más tarde. Por último, nota que en el segundo ejemplo estamos utilizando la función setter directamente como la función a enviar al executor.

Comments are closed.