2016-02-06 2 views
0

Я использую Сельдерей с Ткань. Моя сельдерей задача копирует файл на моей локальной машине Как это:Функция Django-Execute после завершения работы с сельдерей

@app.task 
def copytolocal(): 
get('/home/remote/file.txt','/home/local/') # Copying to local dir 

Когда в представлении я пытаюсь открыть и прочитать файл я получаю IOError, потому что задача еще не завершена

taskfile.app.send_task('taskfile.copytolocal',[]) # Sending task to queue 
open('/home/local/file.txt') #IOError because task isnt completed yet   

Если я использую что-то вроде asyncresult.ready(), то он возвращается False на казнь исполнения. Есть ли способ реализовать что-то вроде обратного вызова или иначе и как это сделать.

+1

Хорошо, что не ясно, что вы хотите сделать - что должно произойти в представлении, если файл не готов? вы хотите заставить клиента ждать? или вы хотите отобразить сообщение пользователю о том, что файл еще не готов? Лично я бы предложил использовать немного магии AJAX, чтобы отобразить местозаполнитель на странице, пока файл не будет готов, а затем загрузите обновление. – scytale

+0

его обычно получает файл (с удаленного сервера) -> читать файл -> записывать содержимое в db. Моя проблема в том, что я хочу, чтобы код чтения файла должен был быть выполнен после завершения работы с сельдереем. В любом случае AJAX был бы подходящим Спасибо – Yudi

ответ

1

Самый простой способ будет сделать

while not asyncresult.ready(): 
    time.sleep(1) 

# Now the file is downloaded 

И если вы хотите немного лучше вы можете использовать callbacks где link это задача, которая должна быть выполнена, когда регулярная задача выполнена.

download_file.apply_async(path, link=write_to_db.subtask(path)) 
+0

отлично, я искал – Yudi

Смежные вопросы