Fabric: Parallele Ausführung unter python3

Erstellt am 2. Dez. 2018  ·  14Kommentare  ·  Quelle: fabric/fabric

Ich konnte keine Dokumente zur parallelen Ausführung für neuere Fabric-Versionen finden. Ist es dasselbe wie die Python 2-Version oder ist es in Arbeit?

Danke!

Hilfreichster Kommentar

@akiuni gibt es dafür eine PR? #1912 (Kommentar)

Hallo, ich glaube nicht. Um ehrlich zu sein, ich weiß, wie ich das überprüfen kann, und ich weiß nicht, wie ich vorgehen soll, um eine solche Änderung einzureichen ...

Alle 14 Kommentare

Ja, aber die Threading-Gruppe unterstützt keine Konfigurationen, insbesondere:

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 erlaubte nur den Ausführungsbefehl.
https://github.com/fabric/fabric/issues/1899#issue -377714688

Sie können die Befehlsunterstützung umschreiben und hinzufügen.

Was halten Sie von dem folgenden Patch, um sudo in SerialGroup und ThreadingGroup zu aktivieren?
(angewendet und getestet auf Stoff 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

Das wäre ehrlich gesagt großartig @akiuni

Es wäre gut, die execute()-Funktion wieder in ThreadingGroup für Fabric2 zu integrieren.

@akiuni gibt es dafür eine PR? https://github.com/fabric/fabric/issues/1912#issuecomment -464652728

@akiuni gibt es dafür eine PR? #1912 (Kommentar)

Hallo, ich glaube nicht. Um ehrlich zu sein, ich weiß, wie ich das überprüfen kann, und ich weiß nicht, wie ich vorgehen soll, um eine solche Änderung einzureichen ...

Wir müssen dies so schnell wie möglich in Fabric integrieren.

mm mit Blick auf den aktuellen Code in v 2.5.0
https://github.com/fabric/fabric/blob/2.5.0/fabric/group.py#L127 Ich sehe, dass dieser Code nicht mehr aktuell ist und dass die Autoren über eine beste Möglichkeit nachdenken, dies zu implementieren. Ohne PR haben sie auch keine Plattform, um die Änderungen zu diskutieren, die der Kodex einführt. Ich schaue mir das an, aber ich bin kein Experte für Python-Codierer, aber ich werde versuchen, es als PR zu versuchen

Hallo, ich bin es nicht gewohnt, mich zu entwickeln (PR ist ein seltsames Wort für mich). Sagen Sie mir ruhig, ob ich helfen kann

Hallo @akiuni
PR steht für Pull Request und bedeutet, dass Sie, wenn Sie eine Änderung vornehmen möchten, diese Änderung über eine Pull-Anfrage in den Quellcode einbringen, die dann als Konversation behandelt und überprüft werden kann, bis sie genehmigt wird. Wenn es genehmigt wurde, können die Änderungen, die das PR einführt, auf ein Commit zurückgeführt werden, wie ich es hier getan habe: #2052
Ein cleverer Trick besteht darin, ".patch" zum Pull-Request (PR) hinzuzufügen, wie hier: https://patch-diff.githubusercontent.com/raw/fabric/fabric/pull/2052.patch , wodurch Sie einen Diff erhalten der Änderungen (wie Sie in Ihrem früheren Kommentar angegeben haben), aber jetzt ist der Vorteil die Konversation / Überprüfung / einzelner Änderungspunkt, wie ich oben erwähnt habe - danke, dass Sie der Erste mit einem Patch dafür sind, den ich gesucht habe dabei, während ich die PR erstellte

Sudo wird gerade zur Gruppe hinzugefügt! Siehe Nr. 1999

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

omzev picture omzev  ·  6Kommentare

haydenflinner picture haydenflinner  ·  5Kommentare

bitprophet picture bitprophet  ·  6Kommentare

bitprophet picture bitprophet  ·  4Kommentare

acdha picture acdha  ·  4Kommentare