2012-01-27 72 views
0

所以我有一个简单的python cgi脚本。 Web前端用于添加东西到数据库,并且我有update()函数可以进行一些清理。python web线程

我想在每次向网站添加内容时运行update()函数,但它需要位于后台。也就是说,网页应该在不等待update()函数完成的情况下完成加载。

现在我用:

-add stuff to db 
Thread(target=update).start() 
-redirect to index page 

这个问题似乎是Python并不想完成,直到更新()线程完成请求(重定向)。

任何想法?

+0

部署举重量选项我们展示的代码。 – Marcin 2012-01-27 12:28:50

+1

这可能超出了CGI的功能 - 您可能需要查看更高级的设置,如WSGI。 (虽然我可能是错的) – 2012-01-27 13:16:42

回答

1

也就是说,网页应完成加载无需等待update()函数来完成

CGI必须等待的过程中 - 作为一个整体 - 来完成。线程没有帮助。

你有三种选择。

  1. subprocess。产生一个单独的“不等待”子进程来执行更新。提供所有信息作为命令行参数。

  2. multiprocessing。让您的CGI连接在队列中放置工作请求。你会开始一个单独的侦听器来处理来自Queue的更新请求。

  3. celery。下载Celery并使用它来管理进行后台处理的独立工作进程。

+0

谢谢,你能解释如何实现选项1吗? – breez 2012-01-27 15:21:05

+0

这似乎很清楚。 http://docs.python.org/library/subprocess.html#replacing-the-os-spawn-family关于子处理有许多堆栈溢出问题。你尝试过“搜索”吗?你有什么特定**问题? – 2012-01-27 16:21:58

+0

子流程在Windows上不起作用。 – breez 2012-01-28 12:47:37

0
  • 你可以一个数据库触发器在响应更新数据库添加到事件例如,如果一个特定的列已经改变
  • 例如启动子,subprocess.Popen([sys.executable, '-c', "from m import update; update()"])。可能无法正常工作取决于你的CGI环境
  • 或刚刚接触update文件由inotify脚本回升到一个单独的进程
  • 开关运行必要的更新,以不同的执行环境,例如,一些多线程WSGI服务器
  • ,你可以使用celery如果它很容易在你的环境