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 произойдет после.
Это не очень хорошая практика, потому что ваш запрос может прерваться по времени и ваш сервер будет занят напрасно, вместо этого вам следует:
- Предупредите клиента о том, что задание было запущено.
- После того, как вы узнаете, что задача выполнена (через службу сообщений или достаточно долгое ожидание), пусть ваш клиент запросит другой маршрут, который извлекает полученный zip.