Paramiko exec_command, не может сделать код, ожидает выполнения задания

Я создаю приложение django под docker. В представлениях я вызываю задачу, в которой paramiko делает ssh-соединение из одного контейнера в другой для запуска стороннего приложения. Проблема в том, что во время вызова другого контейнера я застегиваю папку 'results' и перемещаю ее в другое место. Это требует некоторого времени. Код, однако, возвращается к представлениям и ищет zip-файл, прежде чем он появится там, где должен быть.

tasks.py

@shared_task()
def my_task():
        command2 = f"""sudo cp /.../ibt1.msh /.../ibt1.msh && \n 

        until sudo zip -r result.zip ./output/; do sleep 5; done && \n


        until sudo mv result.zip /europlexusData/result.zip; do sleep 5; done && \n
        sudo rm -rf ./output
        """

        host2 = "+"
        port = ++
        username = "+"
        password = "+"

        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(host2, port, username, password)
        stdin, stdout, stderror = ssh.exec_command(command2, get_pty=True)
        
        return 'Done'

views.py

    my_task.delay()
    file=open('zip/file/to/be/created/in/the/task')
    return FileResponse(file)

Использование my_task.delay() означает, что my_task будет выполняться параллельно с остальной частью вашего представления. Это означает, что моя_задача может даже не быть запущена, когда вы вызовете open в следующей строке. Если вы уберете вызов delay(), ваша задача будет выполняться до конца, а open произойдет после.

Это не очень хорошая практика, потому что ваш запрос может прерваться по времени и ваш сервер будет занят напрасно, вместо этого вам следует:

  1. Предупредите клиента о том, что задание было запущено.
  2. После того, как вы узнаете, что задача выполнена (через службу сообщений или достаточно долгое ожидание), пусть ваш клиент запросит другой маршрут, который извлекает полученный zip.
Вернуться на верх