code_junkie

django,fastcgi: how to manage a long running process?

Nov 11th, 2011
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. import sys
  2. from time import sleep
  3.  
  4. i = 0
  5. while i < 1000:
  6. print 'myjob:', i
  7. i=i+1
  8. sleep(0.1)
  9. sys.stdout.flush()
  10.  
  11. urlpatterns = patterns('',
  12. (r'^startjob/$', 'mysite.myapp.views.startjob'),
  13. (r'^showjob/$', 'mysite.myapp.views.showjob'),
  14. (r'^rmjob/$', 'mysite.myapp.views.rmjob'),
  15. )
  16.  
  17. from tempfile import mkstemp
  18. from os import fdopen,unlink,kill
  19. from subprocess import Popen
  20. import signal
  21.  
  22. def startjob(request):
  23. """Start a new long running process unless already started."""
  24. if not request.session.has_key('job'):
  25. # create a temporary file to save the resuls
  26. outfd,outname=mkstemp()
  27. request.session['jobfile']=outname
  28. outfile=fdopen(outfd,'a+')
  29. proc=Popen("python myjob.py",shell=True,stdout=outfile)
  30. # remember pid to terminate the job later
  31. request.session['job']=proc.pid
  32. return HttpResponse('A <a href="/showjob/">new job</a> has started.')
  33.  
  34. def showjob(request):
  35. """Show the last result of the running job."""
  36. if not request.session.has_key('job'):
  37. return HttpResponse('Not running a job.'+
  38. '<a href="/startjob/">Start a new one?</a>')
  39. else:
  40. filename=request.session['jobfile']
  41. results=open(filename)
  42. lines=results.readlines()
  43. try:
  44. return HttpResponse(lines[-1]+
  45. '<p><a href="/rmjob/">Terminate?</a>')
  46. except:
  47. return HttpResponse('No results yet.'+
  48. '<p><a href="/rmjob/">Terminate?</a>')
  49. return response
  50.  
  51. def rmjob(request):
  52. """Terminate the runining job."""
  53. if request.session.has_key('job'):
  54. job=request.session['job']
  55. filename=request.session['jobfile']
  56. try:
  57. kill(job,signal.SIGKILL) # unix only
  58. unlink(filename)
  59. except OSError, e:
  60. pass # probably the job has finished already
  61. del request.session['job']
  62. del request.session['jobfile']
  63. return HttpResponseRedirect('/startjob/') # start a new one
Add Comment
Please, Sign In to add comment