Fabric: Параллельное выполнение под python3

Созданный на 2 дек. 2018  ·  14Комментарии  ·  Источник: fabric/fabric

Мне не удалось найти никаких документов по параллельному выполнению для более новой версии ткани. Это то же самое, что и версия python 2, или она находится в стадии разработки?

Спасибо!

Самый полезный комментарий

@akiuni есть пиар для этого? #1912 (комментарий)

Привет, я так не думаю.. Честно говоря, я знаю, как это проверить, и я не знаю, как поступить, чтобы отправить такую ​​модификацию...

Все 14 Комментарий

Да, но группа Threading не поддерживает конфиги, в частности:

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 разрешил только команду запуска.
https://github.com/fabric/fabric/issues/1899#issue -377714688

Вы можете переписать и добавить поддержку команд.

Что вы думаете о следующем патче для включения sudo в SerialGroup и ThreadingGroup?
(наносится и тестируется на ткани 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

Честно говоря, это было бы здорово @akiuni

Было бы неплохо вернуть функцию execute() в ThreadingGroup для Fabric2.

@akiuni есть пиар для этого? https://github.com/fabric/fabric/issues/1912#issuecomment-464652728

@akiuni есть пиар для этого? #1912 (комментарий)

Привет, я так не думаю.. Честно говоря, я знаю, как это проверить, и я не знаю, как поступить, чтобы отправить такую ​​модификацию...

Нам нужно как можно скорее объединить это с Fabric.

мм глядя на текущий код в v 2.5.0
https://github.com/fabric/fabric/blob/2.5.0/fabric/group.py#L127 Я вижу, что этот код больше не актуален, и что авторы думают о том, как лучше всего это реализовать. Кроме того, без PR у них нет платформы для обсуждения изменений, которые вводит код. Я смотрю на это, но я не опытный кодировщик Python, но я попытаюсь дать ему шанс в качестве пиара.

Привет, я не привык к git developmentpemen (PR для меня странное слово), не стесняйтесь, скажите, если я могу помочь

привет @akiuni
PR означает запрос на слияние, и это означает, что если вы хотите внести изменение, вы вносите это изменение в исходный код с помощью запроса на слияние, который затем можно рассматривать как беседу и просматривать до тех пор, пока оно не будет одобрено. После одобрения изменения, вносимые PR, можно проследить до коммита, как я сделал здесь: #2052.
Умный трюк состоит в том, чтобы добавить «.patch» к запросу на вытягивание (PR), как здесь: https://patch-diff.githubusercontent.com/raw/fabric/fabric/pull/2052.patch , который затем даст вам diff изменений (как вы указали в своем предыдущем комментарии), но теперь, преимущество в том, что разговор / обзор / единственная точка изменения, как я упоминал выше, - спасибо за то, что вы были первым с патчем для этого, хотя я искал на это пока я создавал PR

Судо добавляется в группу прямо сейчас! См. № 1999

Была ли эта страница полезной?
0 / 5 - 0 рейтинги