首页 > 其他分享 >使用Django和FastCGI管理长时间运行的过程

使用Django和FastCGI管理长时间运行的过程

时间:2024-03-29 10:01:36浏览次数:23  
标签:return request Django job session 长时间 import FastCGI

在这里插入图片描述

  1. 问题背景:

    • 有一个Django+FastCGI的应用程序,需要修改以执行长时间的计算(可能长达半小时或更久)。
    • 需要在后台运行计算,并返回“您的作业已启动”类型的响应。
    • 在进程运行期间,进一步访问该URL应返回“您的作业仍在运行”,直到作业完成,此时应返回作业结果。
    • 以后任何对该URL的访问都应返回缓存的结果。
    • 对Django不太熟悉,不知道是否有内置的方法来实现想要的功能。
    • 尝试通过subprocess.Popen()启动进程,但除了在进程表中留下一个失效的条目之外,它工作正常。
    • 需要一个干净的解决方案,可以在进程完成后删除临时文件和进程的任何痕迹。
    • 也尝试了fork()和线程,但还没有想出可行的解决方案。
    • 想知道对于看似很常见的用例,是否存在规范的解决方案。
  2. 解决方案:

    • 可以使用两种可能的解决方案:

      • 调度长时任务到长时任务管理程序(可能是上面提到的Django-Queue-Service)。
      • 将结果永久保存,无论是文件还是数据库。
    • preferred to use temporary files and to remember their locaiton in the session data. It cannot be made more simple:

    • 代码示例:

      import sys
      from time import sleep
      

i = 0
while i < 1000:
print(‘myjob:’, i)
i = i+1
sleep(0.1)
sys.stdout.flush()

     ```python
from tempfile import mkstemp
from os import fdopen,unlink,kill
from subprocess import Popen
import signal

def startjob(request):
     """Start a new long running process unless already started."""
     if not request.session.has_key('job'):
          # create a temporary file to save the resuls
          outfd,outname=mkstemp()
          request.session['jobfile']=outname
          outfile=fdopen(outfd,'a+')
          proc=Popen("python myjob.py",shell=True,stdout=outfile)
          # remember pid to terminate the job later
          request.session['job']=proc.pid
     return HttpResponse('A <a href="/showjob/">new job</a> has started.')

def showjob(request):
     """Show the last result of the running job."""
     if not request.session.has_key('job'):
          return HttpResponse('Not running a job.'+\
               '<a href="/startjob/">Start a new one?</a>')
     else:
          filename=request.session['jobfile']
          results=open(filename)
          lines=results.readlines()
          try:
               return HttpResponse(lines[-1]+\
                         '<p><a href="/rmjob/">Terminate?</a>')
          except:
               return HttpResponse('No results yet.'+\
                         '<p><a href="/rmjob/">Terminate?</a>')
     return response

def rmjob(request):
     """Terminate the runining job."""
     if request.session.has_key('job'):
          job=request.session['job']
          filename=request.session['jobfile']
          try:
               kill(job,signal.SIGKILL) # unix only
               unlink(filename)
          except OSError, e:
               pass # probably the job has finished already
          del request.session['job']
          del request.session['jobfile']
     return HttpResponseRedirect('/startjob/') # start a new one

标签:return,request,Django,job,session,长时间,import,FastCGI
From: https://blog.csdn.net/huakej_/article/details/137134953

相关文章

  • Django框架之小白必会三板斧
    一、引言Django项目如何添加新功能?在之前的文章中,我们学会了对web框架的封装优化处理,其中的urls.py和views.py尤为重要(1)添加URL映射在项目的urls.py文件中,通过导入相应的应用(app)及其视图函数,并使用path()或include()函数来定义URL映射规则。例如,如果要在名为"myapp......
  • Django框架之静态文件
    一、静态文件配置说明1、HTML文件我们将html文件默认都放在templates文件夹下,2、资源文件将网站所使用的静态文件默认都放在static文件夹下前端已经写好了的,能够直接调用使用的文件。比如:网站写好的js文件网站写好的css文件网站用到的图片文件第三......
  • Django框架之request对象
    一、request对象1、简介服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以。视图的第一个参数必须是HttpRequest对象,在django.http模块中定义了HttpRequest对象的API。ps:get请求携带的数据是有大小限制的,大......
  • Django框架之Django的安装与使用
    首先我们需要先确定好自己电脑上的python解释器环境,否则会导致后面项目所需要的库安装不了以及项目无法运行的问题。一、Django框架下载要下载Django并开始使用它,你可以按照以下步骤进行:1、安装Python首先,确保你的计算机上已经安装了Python。你可以从Python官方网站下载最......
  • django小白必会
    Django基础1.Django小白必会三板斧1.1HttpResponse返回纯文本或者JSON数据fromdjango.shortcutsimportrender,HttpResponsedefindex(request):print(request)#HttpResponse:返回纯文本或者JSON数据returnHttpResponse("ok")1.2render渲染前端......
  • Ajax和django自带序列化组件
    Ajax和django自带序列化组件1.Ajax1.1Ajax介绍AJAX(AsynchronousJavascriptAndXML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。AJAX不是新的编程语言,而是一种使用现有标准的新方法......
  • Django之图形验证码
    【1】生成图片验证码依赖于pillow模块pipinstallpillow使用pillow模块在导入时使用importPIL,而不是pillow【1.1】Pillow图像生成模块fromPILimportImage,ImageDraw,ImageFont#Image:生成图片对象#ImageDraw:生成画笔对象#ImageFont:控制字体样式#图......
  • Django框架之python后端框架介绍
    一、网络框架及MVC、MTV模型1、网络框架网络框架(Webframework)是一种软件框架,用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具,以简化开发过程并提高开发效率。网络框架通常包括以下功能和特点:路由处理(Routing):网络框架定义了URL与处理程序......
  • mysql 主从复制 -- django发送钉钉通知
    mysql主从搭建#之前做过redis的主从,很简单#mysql稍微复杂一些,搭建mysql主从的目的是?-读写分离-单个实例并发量低,提高并发量-只在主库写,读数据都去从库#原理MySQL服务器之间的主从同步是基于二进制日志机制(binlog),主服务器使用二进制日志来(bi......
  • 【附源码】django计算机毕业设计web的学生作业管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化、数字化的教育环境中,学生作业管理已成为教学过程中不可或缺的一部分。传统的作业管理方式,如纸质作业本、电子邮件提交等,存在着效率低下、资源......