【问题标题】:how to run background function after response return from web.py从web.py返回响应后如何运行后台功能
【发布时间】:2019-05-13 06:34:18
【问题描述】:

我想知道,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 秒的等待时间。

预期:先向客户端返回响应,然后在后台运行这部分?

谁能提供一些解决方案。谢谢..

【问题讨论】:

  • 使用 python threading 模块。让文件在单独的线程中保存工作,您当前的线程将正常返回响应。
  • 在后台发送文件写入将意味着您将无法return "Exception occurred" 可以吗?

标签: python web.py


【解决方案1】:

看看python documentation for Thread.run()

注意: 使用后台任务,您将无法像现在那样return "Exception occurred"。我相信你没问题。

这是一个简单的小解决方案。还有其他方法,但我觉得你应该自己探索更多,因为你是 python 初学者。 :)

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()

【讨论】:

  • 谢谢。这个简单的解决方案帮助我理解了线程模块以及响应后在后台运行的功能。真的帮了我很多。
  • @Uday 很高兴它有帮助。仅供参考:如果您觉得任何答案对您有帮助,请投票并标记为已接受。 :)
猜你喜欢
  • 2013-02-24
  • 2017-05-23
  • 2017-08-26
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多