Search code examples
pythoncelery

Celery: Object of type AsyncResult is not JSON serializable


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)

Solution

  • 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)