Мне не удалось найти никаких документов по параллельному выполнению для более новой версии ткани. Это то же самое, что и версия python 2, или она находится в стадии разработки?
Спасибо!
Да, но группа 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, но я попытаюсь дать ему шанс в качестве пиара.
Пиар здесь: https://github.com/fabric/fabric/pull/2052
Привет, я не привык к git developmentpemen (PR для меня странное слово), не стесняйтесь, скажите, если я могу помочь
привет @akiuni
PR означает запрос на слияние, и это означает, что если вы хотите внести изменение, вы вносите это изменение в исходный код с помощью запроса на слияние, который затем можно рассматривать как беседу и просматривать до тех пор, пока оно не будет одобрено. После одобрения изменения, вносимые PR, можно проследить до коммита, как я сделал здесь: #2052.
Умный трюк состоит в том, чтобы добавить «.patch» к запросу на вытягивание (PR), как здесь: https://patch-diff.githubusercontent.com/raw/fabric/fabric/pull/2052.patch , который затем даст вам diff изменений (как вы указали в своем предыдущем комментарии), но теперь, преимущество в том, что разговор / обзор / единственная точка изменения, как я упоминал выше, - спасибо за то, что вы были первым с патчем для этого, хотя я искал на это пока я создавал PR
Судо добавляется в группу прямо сейчас! См. № 1999
Самый полезный комментарий
Привет, я так не думаю.. Честно говоря, я знаю, как это проверить, и я не знаю, как поступить, чтобы отправить такую модификацию...