Как я могу отправить код Python на другую машину для выполнения? - PullRequest
2 голосов
/ 11 августа 2011

Я создаю тестовое приложение на AWS. У меня есть «мастер» машина, которая владеет приложением. Иногда мне бы хотелось, чтобы можно было перегрузить обработку на некоторые подчиненные машины по требованию. Предполагая, что созданный экземпляр подчиненного устройства обладает минимальным необходимым программным обеспечением (не считая моего основного приложения), как я могу «отправить» функциональные блоки кода Python одному или нескольким подчиненным для выполнения?

Я знаю и принимаю, что эта архитектура может быть неоптимальной по многим причинам - и я знаю, что было бы проще, если бы я мог предустановить соответствующий код в моих экземплярах при запуске. Но давайте предположим, что у нас есть жесткое ограничение, состоящее в том, что ведомые экземпляры не могут быть предварительно загружены за пределы ОС и некоторых базовых библиотек - например, что если я захочу выпустить некоторый сгенерированный код на другой машине?

РЕДАКТИРОВАТЬ: StackOverflow - это такой ГОРЯЧИЙ ГОРЯЧИЙ ресурс! Спасибо всем за их ответы. Потрясающие. Дайте мне пару дней, и я вернусь.

Ответы [ 4 ]

3 голосов
/ 11 августа 2011

Я сталкивался с этой проблемой несколько раз в разных вариантах.

Вариант 1 - eval()

Когда я хочу просто быстро что-то взломать, я использую eval() или одного из его двоюродных братьев в stdlib.Перенесите источник в ваш мастер, затем скомпилируйте и оцените:

src = getSourceFromMaster()
obj = compile(src, "master.py", "exec")
exec(obj)

Пока ваш транспорт для передачи источника от клиента к серверу заслуживает доверия и действия, которые должен предпринять источник, относительно просты, это работает.Несколько раз мне требовалась более тесная интеграция между ведущей и подчиненной машинами, с большим количеством операций обработки в обратном направлении или сложных структур данных.В этих случаях я использую Pyro .

Вариант 2 - Pyro

Pyro - полнофункциональная, межплатформенная библиотека удаленного выполнения методов для Python.Я использовал его в производственной среде для отправки обработки с Linux-машины на Windows-машину и обратно, и она была супер стабильной.

Пример из своих документов:

Мастер:

# save this as greeting.py
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. Here is your fortune message:\n" \
               "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)

Ведомый:

# save this as client.py
import greeting
name=raw_input("What is your name? ")
greeting_maker=greeting.GreetingMaker()
print greeting_maker.get_fortune(name)

output:

$ python client.py
What is your name? Irmen
Hello, Irmen. Here is your fortune message:
Behold the warranty -- the bold print giveth and the fine print taketh away.

Самое удивительное в Pyro - это строка "import greeting" в client.py - , что код приходит с сервера.

Если вы начинаете с простой установки ОС, вы можете нажать скрипт Python для размещения клиентского кода для любого из них с помощью SSH сразу после запуска нового экземпляра.Тогда у вас будет хорошая инфраструктура для работы.

Я не могу более подробно говорить о применении любого из них в AWS, а также о том, как они сравниваются с утилитами, предоставляемыми инфраструктурой AWS.Приветствуются идеи или обсуждение по этому вопросу.

1 голос
/ 11 августа 2011

Используйте SSH для scp-кода к ведомому.Настройте подчиненные с парой ключей EC2, предназначенной для этой цели.Поместите пару ключей EC2 на мастер.Это просто и быстро настроить.

Другой вариант - использовать AWS Elastic MapReduce и dumbo или mrjob для управления ведомым устройством.Это более сложная настройка, но она будет более устойчивой к сбоям, предоставит вам функции отслеживания задач и т. Д.

0 голосов
/ 11 августа 2011

Я думаю, Pyro 3 сделает это путем копирования файлов байт-кода python из главного в подчиненное. Тем не менее, я думаю, что этот подход «мобильного кода» является хакерским, потому что это еще одна вещь, которую вы должны протестировать и отладить. Это делает то, что код выполняется (и когда) непредсказуемым, и может создать целый ряд проблем, которые сложнее диагностировать. Распределенные вычисления уже могут быть сложными для управления, я не думаю, что вам нужна сложность, когда вы не знаете, где и где выполняется код.

IMO, вам было бы лучше просто снять это (искусственное?) Ограничение, что вы не можете установить код на рабочих машинах. Как только вы отмените это ограничение и настроите код на своих рабочих, у вас будет множество вариантов. Просто назвать горстку:

Для управления настройкой кода на рабочих вы можете посмотреть на написание сценариев развертывания в Fabric .

0 голосов
/ 11 августа 2011

Вы могли бы исследовать XMLPRClib

Это требует небольшой настройки, но после настройки очень похоже на вызов локальных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...