Простой не сетевой параллелизм с Twisted - PullRequest
4 голосов
/ 29 марта 2010

У меня проблема с использованием Twisted для простого параллелизма в python. Проблема в том, что я не знаю, как это сделать, и все онлайн-ресурсы о возможностях Twisted Networking. Поэтому я обращаюсь к SO-гуру за некоторым руководством.

Используется Python 2.5.

Упрощенная версия моей проблемы работает следующим образом:

  1. куча научных данных
  2. Функция, которая обрабатывает данные и создает вывод
  3. ??? <здесь входит параллелизм, он берет куски данных из <strong>1 и передает их в 2
  4. Вывод из 3 объединяется и сохраняется

Я предполагаю, что Twisted reactor может выполнять работу номер три. Но как?

Большое спасибо за любую помощь и предложения.

upd1:

Простой пример кода. Не знаю, как реактор работает с процессами, поэтому я дал ему мнимые функции:

datum = 'abcdefg'

def dataServer(data):
    for char in data:
        yield chara

def dataWorker(chara):
    return ord(chara)

r = reactor()
NUMBER_OF_PROCESSES_AV = 4
serv = dataserver(datum)
id = 0
result = array(len(datum))

while r.working():
    if NUMBER_OF_PROCESSES_AV > 0:
        r.addTask(dataWorker(serv.next(), id)
        NUMBER_OF_PROCESSES_AV -= 1
        id += 1
    for pr, id in r.finishedProcesses():
        result[id] = pr

Ответы [ 4 ]

4 голосов
/ 30 марта 2010

Как сказал Жан-Поль, Twisted отлично подходит для координации нескольких процессов. Однако, если вам не нужно использовать Twisted и просто нужен распределенный пул обработки, возможно, существуют более подходящие инструменты.

Я могу вспомнить, о чем не упоминалось, это сельдерей . Celery - это распределенная очередь задач - вы настраиваете очередь задач, работающих с БД, Redis или RabbitMQ (вы можете выбрать один из нескольких вариантов бесплатного программного обеспечения), и записываете ряд вычислительных задач. Это могут быть произвольные задачи научного типа. Задачи могут порождать подзадачи (реализуя шаг «присоединения», который вы упомянули выше). Затем вы начинаете столько рабочих, сколько вам нужно, и выполняете вычисления.

Я большой пользователь Twisted и Celery, так что в любом случае оба варианта хороши.

3 голосов
/ 29 марта 2010

Чтобы фактически вычислить вещи одновременно, вам, вероятно, потребуется использовать несколько процессов Python. Один процесс Python может чередовать вычисления, но он не будет выполнять их параллельно (за некоторыми исключениями).

Twisted - хороший способ скоординировать эти множественные процессы и собрать их результаты. Одной из библиотек, ориентированных на решение этой задачи, является Ampoule. Вы можете найти больше информации об Ампуле на странице Launchpad: https://launchpad.net/ampoule.

2 голосов
/ 30 марта 2010

Вам нужен Twisted вообще?

Из вашего описания проблемы я бы сказал, что многопроцессорная обработка будет отвечать всем требованиям. Создайте количество Process объектов, которым дана ссылка на один экземпляр Queue. Заставьте их начать свою работу и поместите их результаты в Queue. Просто используйте блокировку get() s, чтобы прочитать результаты.

1 голос
/ 16 апреля 2010

Мне кажется, что вы неправильно понимаете основы работы Twisted. Я рекомендую вам дать Twisted Intro шанс Дейва Петиколаса . Это мне очень помогло, и я использую Twisted уже много лет!

СОВЕТ: Все в Twisted использует реактор !

Петля реактора http://krondo.com/blog/wp-content/uploads/2009/07/reactor-1.png

...