I am running my function with help of celery and celery beat
I have this error: (returned object isn't in json format)
celery_1_a510f09c95a3 | [2022-08-30 01:30:00,069: ERROR/ForkPoolWorker-8] Task
parser_app.views.periodic_exctract_urls[d65eb6a3-187b-4f48-afe6-b7df101cdbcd] raised
unexpected: EncodeError(TypeError('Object of type AsyncResult is not JSON serializable'))
My code (the first function returns a list of ints)
@shared_task()
def periodic_exctract_urls():
print(f"{datetime.datetime.now()} Start periodic_exctract_urls")
celery_results = []
film_name_queries = SearchQuery.objects.filter(is_site_search=False)
url_queries = SearchQuery.objects.filter(is_site_search=True)
for film in film_name_queries:
celery_results.append(make_requests.delay(str(film.name)))
for url in url_queries:
for film in film_name_queries:
celery_results.append(make_requests.delay(
f"site:{url.name} {film.name}"
))
task_ids = []
task_ids.extend([result.collect() for result in celery_results])
return task_ids
@shared_task()
def make_requests(search_text) -> int:
...
return int(created_task.pk)
By calling make_requests.delay
, you got AsyncResult
(doc). If you would like to get the return value from make_request
task, you can use collect
method. For example:
@shared_task()
def periodic_exctract_urls():
print(f"{datetime.datetime.now()} Start periodic_exctract_urls")
task_ids = []
film_name_queries = SearchQuery.objects.filter(is_site_search=False)
url_queries = SearchQuery.objects.filter(is_site_search=True)
results = []
for film in film_name_queries:
results.append(make_requests.delay(str(film.name)))
...
task_ids.extend([result.collect() for result in results])
return task_ids
@shared_task()
def make_requests(search_text) -> int:
...
return int(created_task.pk)