Size: a a a

Django [ru] #STAY HOME

2020 August 22

A

Arr0w in Django [ru] #STAY HOME
Dima Boger
А оно выполняется? Никогда не видел синтаксиса через return group
Та оно и без него работает, просто думал может в этом проблема
источник

DB

Dima Boger in Django [ru] #STAY HOME
а, так я вижу в чём проблем)
источник

DB

Dima Boger in Django [ru] #STAY HOME
покажи https_test
источник

A

Arr0w in Django [ru] #STAY HOME
Dima Boger
покажи https_test
def https_test(proxy, url="https://www.google.com/"):
   try:
       requests.get(url, proxies={"https": proxy.proxy}, timeout=5)
   except (TimeoutError, requests.exceptions.ConnectTimeout, requests.exceptions.ProxyError):
       print('FAIL', proxy)
       proxy.delete()
       return False
   else:
       print('GOOD', proxy)
       proxy.status = 2  # 2 is live
       proxy.save()
       return True
источник

DB

Dima Boger in Django [ru] #STAY HOME
https_test должна быть celery-task, и запускаться не напрямую

group принимает на вход таски, а ты прям функцию вызываешь
источник

DB

Dima Boger in Django [ru] #STAY HOME
т.е. у тебя [call(args) for args in objects] выполняется прям сразу
источник

DB

Dima Boger in Django [ru] #STAY HOME
сделай обёртку над http_test с celery.task
источник

DB

Dima Boger in Django [ru] #STAY HOME
А потом
tasks = group([https_test_task.s(arg) ...])
tasks.delay()
источник

DB

Dima Boger in Django [ru] #STAY HOME
task.s() ->  вернёт заполненную аргументами таску
group([...]) -> создаст группу из параллельных тасок
.delay() положит группу в очередь задач
источник

DB

Dima Boger in Django [ru] #STAY HOME
Ещё в аргументах тасок лучше использовать простые типы данных — строки, числа. Объекты моделей передавать — плохая идея
источник

A

Arr0w in Django [ru] #STAY HOME
Dima Boger
task.s() ->  вернёт заполненную аргументами таску
group([...]) -> создаст группу из параллельных тасок
.delay() положит группу в очередь задач
а что такое "_task.s", откуда это вообще ?
источник

A

Arr0w in Django [ru] #STAY HOME
Dima Boger
Ещё в аргументах тасок лучше использовать простые типы данных — строки, числа. Объекты моделей передавать — плохая идея
Сейчас пофикшу
источник

DB

Dima Boger in Django [ru] #STAY HOME
Arr0w
а что такое "_task.s", откуда это вообще ?
_task — это я предложил функцию обернуть в селери-таску @app.task

.s — это интерфейс селери-тасок https://docs.celeryproject.org/en/stable/userguide/canvas.html#signatures (вообще очень полезная дока про канвас, стоит почитать)

@app.task
def check_proxy():


сделает из твоей функции специальный объект celery.Task, который можно положить в очередь

у него есть и .delay(), и .s()
источник

DB

Dima Boger in Django [ru] #STAY HOME
я предлагаю сделать что-нибудь вроде

@app.task
def https_test_task(arg1, arg2):
   https_test(arg1, arg2)
источник

DB

Dima Boger in Django [ru] #STAY HOME
ну или если https_test нигде не используется кроме селери, то прям её и в таску обернуть

но бизнес-логика прямо в тасках это bad practice
источник

MZ

Mikhail Zanozin in Django [ru] #STAY HOME
А почему бы просто не кидать в очередь по имени, а там пусть воркер с ними разбирается по приоритетам?
источник

A

Arr0w in Django [ru] #STAY HOME
Dima Boger
ну или если https_test нигде не используется кроме селери, то прям её и в таску обернуть

но бизнес-логика прямо в тасках это bad practice
Спасибо большое, сейчас попробую сделать
источник

DB

Dima Boger in Django [ru] #STAY HOME
Mikhail Zanozin
А почему бы просто не кидать в очередь по имени, а там пусть воркер с ними разбирается по приоритетам?
просто в цикле https_test_task.delay()?
источник

DB

Dima Boger in Django [ru] #STAY HOME
фишка групп в том, что они обёрнуты в магическую джобу, которая собирает результат всех тасок в группе

поэтому если надо не просто выполнить 100 задач, но и потом посмотреть результат этих 100 задач, то это очень удобная абстракция
источник

MZ

Mikhail Zanozin in Django [ru] #STAY HOME
Dima Boger
просто в цикле https_test_task.delay()?
Не совсем. Я про https://docs.celeryproject.org/en/stable/reference/celery.html#celery.Celery.send_task

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