2013-12-10 3 views
1

Я определил задачу Django (она запускается с использованием ./manage.py task_name). Эта задача считывает набор объектов из базы данных и выполняет операцию (обычно отправляя пинг) на каждом из них, записывая каждый отдельный результат обратно в базу данных.Лучший способ распараллеливания функций из задачи django

В настоящее время у меня есть простой цикл for, но он явно слишком медленный, потому что он ждет завершения каждого пинга, чтобы начать со следующего. Итак, мой вопрос: какой лучший способ распараллеливать операции?

Насколько я понял, лучший способ, который я нашел, - использовать Pool с модуля multiprocessing, что-то вроде the code in this answer.

ответ

1

Для вашей задачи, которая кажется довольно простой, multiprocessing, вероятно, самый простой способ, хотя бы потому, что он уже является частью stdlib. Вы можете сделать это примерно так (непроверенный!):

def run_process(record): 
    result = ping(record) 

pool = Pool(processes=10) 
results = pool.map_async(run_process, [records]) 
for r in results.get(): 
    write_to_database(r) 
0

Я бы сказал, что лучший инструмент будет каким-тем событие управляемой сети двигателем как twisted library

в отличии от многопоточных/мульти решений обработки, управляемых событиями сетевых двигателей сиять, когда дело доходит до интенсивных операций ввода-вывода, без контекста переключение и ожидание работы блока, они наиболее эффективно используют системные ресурсы.

Один из способов использования скрученной библиотеки - написать scrapy spider, который будет обрабатывать как внешние сетевые вызовы, так и те запросы ping, которые вы упомянули, а также написание ответа на базу данных.

несколько рекомендаций для написания такого паука:

  1. читать список паутинный ссылок из базы данных см https://gist.github.com/saidimu/1024207
  2. правильно писать ответы в базе данных см Writing items to a MySQL database in Scrapy

как только вы напишите этот паук, просто запустите его из своей команды django или прямо из оболочки:

scrapy crawl <spider name> 
1

Я бы просто порекомендовал celery.

Запишите задачи сельдерея для операций, которые вы хотите выполнить распараллеливанием/асинхронным. Пусть сельдерей справится с параллелизмом, и ваш собственный код может избавиться от управления процессом беспорядка.

Смежные вопросы