Сельдерей: почему его распределенные задачи работают медленнее, чем многопроцессорная? - PullRequest
0 голосов
/ 04 июня 2018

Мой компьютер имеет 16 ядер процессора и пытается сравнить время выполнения задачи между celery и multiprocessing

Вот эксперименты (update_daily_price - это метод для сканирования некоторых данных о дневных ценах акцийданный символ из Интернета)

1) Процесс с одной нитью

код

for s in symbol_list:
    update_daily_price(symbol)

Это заняло всего "12 минут 54 сек"

2) muliprocessing библиотекарь

код

pool = Pool(8)
pool.map(update_daily_price, symbol_list)
pool.close()
pool.join()

Потребовалось всего "2 минуты 10 секунд"

3) celery сapply_async ()

Я запустил рабочий процесс с помощью celery --workdir=trading/ --concurrency=8 -P eventlet worker

и запустил задачу, подобную этой:

код

@shared_task
def update_dailyprice_task1(symbol):
    update_daily_price(symbol)

from celery import group
jobs = group(update_dailyprice_task1.s(symbol) for symbol in symbol_list)
jobs.apply_async()

Это заняло всего "10 минут 24 сек"

Как вы можете видеть здесь, разница между 1) и 3) почти не так велика.Я что-то упускаю при выполнении задач по распределению сельдерея?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Решите это, используя Бильярд

Ссылка: https://github.com/celery/celery/issues/4525

0 голосов
/ 09 июня 2018

Проблема исходит от вашей команды сельдерея:

celery --workdir=trading/ --concurrency=8 -P eventlet worker

Согласно этой странице , вы просите сельдерея создать одного работника с 8 зелеными нитями.Что отличается от создания 8 процессов.Это эффективно создаст один процесс, который использует 8 потоков.Поскольку ваша функция, вероятно, требует значительных вычислительных ресурсов, вы в конечном итоге получите результаты, сопоставимые с выполнением одного процесса.

Чтобы использовать несколько процессов, вам необходимо использовать предварительно обработчики.С помощью следующей команды вы получите сопоставимые результаты с библиотекой multiprocessing:

celery --workdir=trading/ --concurrency=8 worker
...