2016-04-15 4 views
1

Я пытаюсь запустить несколько скриптов на нескольких серверах одновременно. Вот пример кода.python fabric для параллельной обработки

server1 = "" 
server2 = "" 

env.parallel = True 

@task 
@hosts(server1) 
@parallel 
def run_shell1(): 
    run("sh shell1.sh") 

@task 
@hosts(server2) 
@parallel 
def run_shell2(): 
    run("sh shell2.sh") 

И я побежал ливерпульской команды, как это:

fab run_shell1 run_shell2 

Но когда я запускал код, я получил ошибку вроде этого:

pickle.PicklingError: Can't pickle <function inner at 0x0000000003280438>: it's 
not found as fabric.tasks.inner 

Там были также некоторые другие ошибки сообщения о многопроцессорности/process.py и fabric/job_queue.py и т. д.

Я проверил версию ткани, это 1 .11.1.

+0

Это ваш полный код? Я не эксперт по ткани, но что-то кажется пропавшим. –

+0

Да, это почти полный код. Чего не хватает? –

+0

Не уверен, на основании сообщения об ошибке я бы ожидал увидеть какую-то внутреннюю функцию, например, вложенную задачу или что-то в этом роде, но, возможно, она имеет какое-то отношение к '@ parallel', я сам не использовал эту функцию. –

ответ

2

Там это известная ошибка в ткани, связанные с этой проблемой:

https://github.com/fabric/fabric/issues/489

Более конкретно, это увидеть для объяснения: https://github.com/fabric/fabric/issues/489#issuecomment-4232091

Суть в том, что forking.Popen() реализация для Win32 вызывает проблемы при многопроцессорной обработке.

Я предполагаю, что они будут фиксировать его с помощью ткани 2.x

+0

Wow, 2 seconds diff :) Я просто удалю свой ответ. Хороший! –

+0

Хе-хе. Ты поймал меня. – nir0s