1

Is it available to call an async function inside django main view function, and return main before the second is continuing its execution? As video convert is taking too long, I need to return media paths before convert finishes.

views.py

async def optimize(request):
    
    serializer_data = FileUploadSerializer(data=request.FILES).custom_validation()
    media_paths = {}
    
    for data in serializer_data.validated_data:
        #converting video
        if data == 'video':
            media_paths['video'] = []            
            for file in serializer_data.validated_data['video']:
 
                file_path = file.file.name
                file_name = generate_file_name()
                new_path = os.path.join(settings.BASE_DIR, 'media')
                extension = file.name.rsplit('.', 1)[-1]
                
                loop = asyncio.get_event_loop()
                loop.create_task(video_converter.start_convert(file_path, file_name, new_path))
                # loop.run_until_complete(video_converter.start_convert(file_path, file_name, new_path))
                
                media_paths['video'].append(request.build_absolute_uri() + "media/video/" + file_name + "." + extension)
        

    
    return JsonResponse(media_paths)

video_converter.py

    clip = VideoFileClip(f"{file_path}")
    if round(clip.w/clip.h, 2) == 1.78:
        if clip.h < 720:     
            clip.write_videofile(f"{new_path}\\video\{file_name}.mp4", fps=24)
            clip.close()
        else:
            clip_resized = clip.resize(height=720)
            clip_resized.write_videofile(f"{new_path}\\video\{file_name}.mp4", fps=24)
            clip.close()
        return new_path + file_name + '.mp4'
    else:
        clip.close()
        raise Exception("Uploaded video resolution is not supported")

1 Answer 1

1

Found a solution for the issue I described above. I used python threading module and passes the variables to the newly created tread like so. And when the main function finishes it's execution and returns, the threads starts its execution with the parameters passed to it by main function.

import threading

def my_func(a):
    time.sleep(5)
    print(f"my number is {a}") 

def main(a, b):
    task = threading.Thread(target=my_func, args=(a,))
    task.daemon = True
    task.start()
    return a + b
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.