Fabric: Exécution parallèle sous python3

Créé le 2 déc. 2018  ·  14Commentaires  ·  Source: fabric/fabric

Je n'ai trouvé aucune documentation sur l'exécution parallèle pour la nouvelle version de fabric. Est-ce la même chose que la version python 2, ou est-ce un travail en cours ?

Merci!

Commentaire le plus utile

@akiuni y a-t-il un PR pour ça ? #1912 (commentaire)

Bonjour, je ne pense pas.. Pour être honnête, je sais vérifier cela et je ne sais pas comment procéder pour soumettre une telle modification...

Tous les 14 commentaires

Oui, cependant, le groupe Threading ne prend pas en charge les configurations, en particulier :

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 n'autorisait que la commande d'exécution.
https://github.com/fabric/fabric/issues/1899#issue -377714688

Vous pouvez réécrire et ajouter le support de commande.

Que pensez-vous du patch suivant pour activer sudo dans SerialGroup et ThreadingGroup ?
( appliqué et testé sur tissu 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

Ce serait vraiment génial @akiuni

Il serait bon de remettre la fonctionnalité execute() dans ThreadingGroup pour Fabric2.

@akiuni y a-t-il un PR pour ça ? https://github.com/fabric/fabric/issues/1912#issuecomment -464652728

@akiuni y a-t-il un PR pour ça ? #1912 (commentaire)

Bonjour, je ne pense pas.. Pour être honnête, je sais vérifier cela et je ne sais pas comment procéder pour soumettre une telle modification...

Nous devons fusionner cela dans Fabric dès que possible.

mm en regardant le code actuel dans v 2.5.0
https://github.com/fabric/fabric/blob/2.5.0/fabric/group.py#L127 Je constate que ce code n'est plus d'actualité et que les auteurs réfléchissent à la meilleure façon de l'implémenter. De plus, sans relations publiques, ils n'ont aucune plate-forme pour discuter des changements introduits par le code. Je regarde ça, mais je ne suis pas un codeur python expert, mais je vais essayer de tenter le coup en tant que PR

Bonjour, je n'ai pas l'habitude de git developpemen (PR est un mot étrange pour moi), n'hésitez pas à me dire si je peux vous aider

salut @akiuni
PR signifie Pull Request, et cela signifie que, si vous souhaitez apporter une modification, vous apportez cette modification dans le code source via une demande d'extraction, qui peut ensuite être traitée comme une conversation et examinée jusqu'à ce qu'elle soit approuvée. Lorsqu'il a été approuvé, les modifications introduites par le PR peuvent être attribuées à un commit comme je l'ai fait ici : #2052
Une astuce astucieuse consiste à ajouter ".patch" à la pull request (PR) comme ici : https://patch-diff.githubusercontent.com/raw/fabric/fabric/pull/2052.patch qui vous donnera alors un diff des changements (comme vous l'avez fourni dans votre commentaire précédent) mais maintenant, l'avantage est, la conversation / révision / point unique de changement comme je l'ai mentionné ci-dessus - merci d'être le premier avec un patch pour cela cependant, je cherchais pendant que je créais le PR

Sudo est ajouté au groupe en ce moment ! Voir #1999

Cette page vous a été utile?
0 / 5 - 0 notes