Fabric: Ejecución paralela bajo python3

Creado en 2 dic. 2018  ·  14Comentarios  ·  Fuente: fabric/fabric

No pude encontrar ningún documento sobre la ejecución en paralelo para la versión de tejido más reciente. ¿Es lo mismo que la versión de Python 2, o es un trabajo en progreso?

¡Gracias!

Comentario más útil

@akiuni ¿hay relaciones públicas para esto? # 1912 (comentario)

Hola, no lo creo.. Para ser honesto, sé cómo verificar eso y no sé cómo proceder para enviar tal modificación...

Todos 14 comentarios

Sí, sin embargo, el grupo Threading no admite configuraciones, en particular:

config = Config(overrides={'sudo':{'password': 'changeme'}})

c = ThreadingGroup("[email protected]", "[email protected]", connect_kwargs={"password": "changeme"}, config=config)

c.run("whoami")

c.sudo("whoami") #Throws AttributeError: 'ThreadingGroup' object has no attribute 'sudo'

ThreadingGroup solo permitía ejecutar el comando.
https://github.com/fabric/fabric/issues/1899#issue -377714688

Puede reescribir y agregar el soporte de comando.

¿Qué opinas sobre el siguiente parche para habilitar sudo en SerialGroup y ThreadingGroup?
( aplicado y probado en tela 2.4 )

--- fabric-orig/group.py    2018-10-30 14:35:22.000000000 +0100
+++ fabric-patched/group.py 2019-02-18 10:16:29.186000000 +0100
@@ -183,12 +183,28 @@
             raise GroupException(results)
         return results

+    def sudo(self, *args, **kwargs):
+        results = GroupResult()
+        excepted = False
+        for cxn in self:
+            try:
+                results[cxn] = cxn.sudo(*args, **kwargs)
+            except Exception as e:
+                results[cxn] = e
+                excepted = True
+        if excepted:
+            raise GroupException(results)
+        return results

 def thread_worker(cxn, queue, args, kwargs):
     result = cxn.run(*args, **kwargs)
     # TODO: namedtuple or attrs object?
     queue.put((cxn, result))

+def thread_worker_sudo(cxn, queue, args, kwargs):
+    result = cxn.sudo(*args, **kwargs)
+    # TODO: namedtuple or attrs object?
+    queue.put((cxn, result))

 class ThreadingGroup(Group):
     """
@@ -208,6 +224,49 @@
             )
             threads.append(thread)
         for thread in threads:
+            thread.start()
+        for thread in threads:
+            # TODO: configurable join timeout
+            # TODO: (in sudo's version) configurability around interactive
+            # prompting resulting in an exception instead, as in v1
+            thread.join()
+        # Get non-exception results from queue
+        while not queue.empty():
+            # TODO: io-sleep? shouldn't matter if all threads are now joined
+            cxn, result = queue.get(block=False)
+            # TODO: outstanding musings about how exactly aggregate results
+            # ought to ideally operate...heterogenous obj like this, multiple
+            # objs, ??
+            results[cxn] = result
+        # Get exceptions from the threads themselves.
+        # TODO: in a non-thread setup, this would differ, e.g.:
+        # - a queue if using multiprocessing
+        # - some other state-passing mechanism if using e.g. coroutines
+        # - ???
+        excepted = False
+        for thread in threads:
+            wrapper = thread.exception()
+            if wrapper is not None:
+                # Outer kwargs is Thread instantiation kwargs, inner is kwargs
+                # passed to thread target/body.
+                cxn = wrapper.kwargs["kwargs"]["cxn"]
+                results[cxn] = wrapper.value
+                excepted = True
+        if excepted:
+            raise GroupException(results)
+        return results
+
+    def sudo(self, *args, **kwargs):
+        results = GroupResult()
+        queue = Queue()
+        threads = []
+        for cxn in self:
+            my_kwargs = dict(cxn=cxn, queue=queue, args=args, kwargs=kwargs)
+            thread = ExceptionHandlingThread(
+                target=thread_worker_sudo, kwargs=my_kwargs
+            )
+            threads.append(thread)
+        for thread in threads:
             thread.start()
         for thread in threads:
             # TODO: configurable join timeout

Honestamente, eso sería genial @akiuni

Sería bueno recuperar la función de ejecución () en ThreadingGroup para Fabric2.

@akiuni ¿hay relaciones públicas para esto? https://github.com/fabric/fabric/issues/1912#issuecomment-464652728

@akiuni ¿hay relaciones públicas para esto? # 1912 (comentario)

Hola, no lo creo.. Para ser honesto, sé cómo verificar eso y no sé cómo proceder para enviar tal modificación...

Necesitamos fusionarlo con Fabric lo antes posible.

mm mirando el código actual en v 2.5.0
https://github.com/fabric/fabric/blob/2.5.0/fabric/group.py#L127 Puedo ver que este código ya no está actualizado y que los autores están pensando en la mejor manera de implementarlo. Además, sin relaciones públicas, no tienen una plataforma para discutir los cambios que introduce el código. Estoy viendo esto, pero no soy un codificador experto en Python, pero intentaré intentarlo como relaciones públicas.

Hola, no estoy acostumbrado a desarrollar gits (PR es una palabra extraña para mí), no dudes en decirme si puedo ayudar.

hola @akiuni
PR significa Solicitud de extracción, y significa que, si desea realizar un cambio, debe incluir ese cambio en el código fuente a través de una solicitud de extracción, que luego puede tratarse como una conversación y revisarse hasta que se apruebe. Cuando se ha aprobado, los cambios que introduce el RP se remontan a una confirmación como la que he hecho aquí: #2052
Un truco inteligente es agregar ".patch" a la solicitud de extracción (PR) como aquí: https://patch-diff.githubusercontent.com/raw/fabric/fabric/pull/2052.patch que luego le dará una diferencia de los cambios (como proporcionó en su comentario anterior) pero ahora, el beneficio es, la conversación/revisión/punto único de cambio como mencioné anteriormente. Gracias por ser el primero con un parche para esto, sin embargo, estaba buscando en eso mientras creaba el PR

¡Sudo se está agregando al grupo ahora mismo! Ver #1999

¿Fue útil esta página
0 / 5 - 0 calificaciones