как запустить фоновую функцию после возврата ответа из web.py - PullRequest
0 голосов
/ 13 мая 2019

Хотелось бы знать, возможно ли запустить функцию после ответа от сервиса web.py, какая функция выполняется долго?

Позвольте привести пример, приведенный ниже.

Имя файла: code.py

import web

import time 

urls = (
    '/', 'index'
)

app = web.application(urls, globals())

class index:

    def GET(self):

        try:
           with open('filename.txt', 'a') as file:
                for i in range(100):
                    time.sleep(1)
                    file.write("No of times: {}".format(i))
           return "some json response"
        except:
            return "Exception occurred"

if __name__ == "__main__":     
     app.run()

Когда я запускаю приведенный выше код, очевидно, что потребуется время, потому что, поскольку мы используем модуль времени для сна в течение одной секунды, а затем записываем в файл,Итак, я должен ждать 100 секунд, чтобы получить ответ от службы.

Я хочу пропустить это время ожидания 100 секунд.

Ожидается: Сначала вернуть ответ клиенту, а затем запустить эту часть в фоновом режиме?

Может кто-нибудь предложить какое-нибудь решение.Спасибо ..

1 Ответ

0 голосов
/ 13 мая 2019

Просмотрите документацию по питону для Thread.run()

Примечание: С фоновой задачей вы не сможете return "Exception occurred", как сейчас.Я считаю, что вы в порядке с этим.

Вот небольшое простое решение.Есть и другие способы, но я чувствую, что вы должны исследовать больше самостоятельно, так как вы новичок в питоне.:)

import web
import time 

urls = (
    '/', 'index'
)

app = web.application(urls, globals())

class index:

    def writeToFile():
     try:
       with open('filename.txt', 'a') as file:
            for i in range(100):
                time.sleep(1)
                file.write("No of times: {}".format(i))
       # Log completion
    except:
        # Log error

    def GET(self):
        thread = Thread(target=writeToFile)
        thread.start()

        return {<myJSON>}

if __name__ == "__main__":     
     app.run()
...