Django сельдерея позиционные аргументы ошибка планирования сельдерея
У меня проблемы с получением сельдерея для планирования моей функции из-за позиционных аргументов.
читая документацию, я не понимаю, почему некоторые функции относятся к числу, а некоторые нет. Я попытался добавить в аргументы, такие же, как мои функции, но я получаю следующую ошибку
check_arguments(*(args or ()), **(kwargs or {}))
celery.beat.SchedulingError: Couldn't apply scheduled task
list_market_catalogue: list_market_catalogue() takes 1 positional
argument but 3 were given
Может кто-то указать мне верное направление?
tasks.py
ET_TENNIS = 2
@shared_task(bind=True)
def list_market_catalogue(self):
logger.warning('+' * 80)
trading = get_betfair_client()
time_ago = timezone.now() + datetime.timedelta(minutes=1000)
time_fwd = timezone.now() + datetime.timedelta(minutes=6000)
mfilter = market_filter(
event_type_ids=[ET_TENNIS] ,
market_start_time=time_range(
from_=time_ago.strftime('%Y-%m-%dT%H:%I:%S.000Z') ,
to=time_fwd.strftime('%Y-%m-%dT%H:%I:%S.000Z')
)
)
res = trading.betting.list_market_catalogue(
mfilter ,
market_projection=[
'EVENT' ,
'MARKET_START_TIME' ,
# 'MARKET_DESCRIPTION',
# 'RUNNER_METADATA',
] ,
sort='FIRST_TO_START' ,
max_results=100 ,
lightweight=True)
if not len(res):
logger.error('Market catalogue listing is empty')
trading.session_token = None
raise self.retry(countdown=5 , max_retries=12)
for cat in res:
if 'venue' not in cat['event']:
logger.error(f'No event venue in {cat}')
continue
try:
event = parse_event(cat['event'])
market = parse_market(event , cat)
runners = parse_runners(market , cat['runners'])
except:
logger.warning(cat)
raise
logger.warning(f'BETFAIR: Scraped {len(res)} from market
catalogue')
@shared_task
def parse_runners(market , items):
"""Parses runners from MarketCatalogue object"""
runners = []
for runner_item in items:
num = runner_item['metadata'].get('CLOTH_NUMBER')
if not num:
matches = re.match(r'^(\d+)' , runner_item['runnerName'])
if matches:
num = matches.groups(0)[0]
else:
logger.error(f'Could not match number for
{runner_item}')
runner , created = Runner.objects.update_or_create(
selection_id=runner_item['selectionId'] ,
defaults={
'market': market ,
# default
'name': runner_item['runnerName'].upper() ,
'sort_priority': runner_item['sortPriority'] ,
'handicap': runner_item['handicap'] ,
# metadata
'cloth_number': num ,
'stall_draw':
runner_item['metadata'].get('STALL_DRAW') ,
'runner_id': runner_item['metadata']['runnerId'] ,
}
)
if created:
logger.info(f'Created {runner}')
else:
logger.debug(f'Updated {runner}')
runners.append(runner)
return runners
settings.py
CELERY_BEAT_SCHEDULE = {
'list_market_catalogue': {
'task': 'trader.tasks.list_market_catalogue',
'schedule': timedelta(seconds=5),
'args': (['self'],)
},
'parse_runners': {
'task': 'trader.tasks.parse_runners' ,
'schedule': timedelta(seconds=5) ,
'args': (['market'],['items'])
},
2 ответа
Используйте *args в качестве параметров функции во всех функциях, которые вы используете в качестве задачи.
используйте эти аргументы для получения параметров. Скажем, в функции parse_runners(market,items): вы можете использовать как parse_runners(*args) , а внутри функции вы можете назначить market=args[0] и items=args[1]
Я получил аналогичную ошибку ниже для сельдерея:
celery.beat.SchedulingError: не удалось применить запланированное задание Scheduled_task: тип таблицы <класс 'my_app.tasks.display'> для ключевого b'task', не обрабатываемого amqp. [значение: <@task: my_app.tasks.display ядра по адресу 0x1c4ba61c160>]
Потому что у меня есть задача, как показано ниже:
# "my_app/tasks.py"
from celery import shared_task
@shared_task
def display(arg):
return arg
Затем я поставил задачу, импортировав ее, как показано ниже:
# "core/settings.py"
from my_app.tasks import display
CELERY_BEAT_SCHEDULE = {
"scheduled_task": {
"task": display, # Here
"schedule": 5.0,
"args": ["Test"],
}
}
Поэтому, чтобы устранить ошибку, я установил"my_app.tasks.display"
к"task"
без импортаdisplay
задание отmy_app.tasks
как показано ниже, тогда ошибка была решена:
# "core/settings.py"
# from my_app.tasks import display
CELERY_BEAT_SCHEDULE = {
"scheduled_task": {
"task": "my_app.tasks.display", # Here
"schedule": 5.0,
"args": ["Test"],
}
}