是否有一种简单的方法可以从Python CGI脚本启动后台任务,而无需等待其终止?

Windows中,就是这样.

我认为这个问题的答案是我需要创建Windows服务.对于我想做的事情,这似乎很可笑.

我只是想在这里为我的经理拍些原型,我不负责产品的生产……事实上,它甚至可能永远都不会被产品化.它可能只是一些研究人员在玩的东西.

我有一个CGI脚本,该脚本接收要上传的文件,将其存储到一个临时位置,然后启动一个后台进程对文件进行一些严格的数字运算.然后,一些Javascript内容围绕调用其他CGI脚本以检查状态并根据需要更新页面.

只要子进程正在运行,除了可恶的Web服务器不会关闭连接之外,所有这些工作都可以进行.我已经做了一些搜索,在Unix上看来答案是使它成为守护程序,但是我现在仍停留在Windows上,我想答案是使它成为Windows服务?!?要启动一个该死的进程,然后关闭服务器连接,这似乎是非常沉重的.

那真的是唯一的方法吗?

编辑:好的,在这里找到了一个漂亮的小技巧(这个家伙给出的选择(3)):
How to completely background a process in Perl CGI under IIS

我能够对其进行修改,以使其更简单,尽管这是一个繁琐的解决方案,但它对于我要制作的快速且肮脏的小原型是完美的.

因此,最初,我的主要脚本是这样做的:

subprocess.Popen("python.exe","myscript.py","arg1","arg2")

正如我所描述的,这不起作用.取而代之的是,我现在让我的主脚本发出这小段Javascript,该Javascript在文档完全加载后运行:

$("#somecrap").load("launchBackgroundProcess.py", {arg1:"foo",arg2:"bar"});

然后launchBackgroundProcess.py执行subprocess.Popen.

该解决方案永远无法扩展,因为在后台任务运行的整个过程中,它仍使浏览器连接保持打开状态.但是由于这个小问题,总有一天我可能最多同时拥有两个用户(即使我对此表示怀疑),也不用担心资源.这允许用户查看主页并获取Javascript更新,即使仍然没有充分的理由将HTTP连接挂起也是如此.

感谢您的回答!如果有人要求我将其具体化,我将使用Profane建议的资源.

解决方法:

如果您对Windows编程没有太多的经验,并且不想细读MSDN文档-我不怪您-您可能想尝试获取Mark Hammond的有关Python和Linux的一切规范指南的副本.视窗.在许多这类重复出现的问题上,它永远不会过时.与其使用全平台解决方案启动该过程,不如使用win32process模块​​可能会更好.哈蒙德(Hammond)书的第17章对此进行了广泛的介绍,但是您可以通过下载pywin ide(我认为它包含在Windows扩展中,您可以从pypi下载)中获得所需的所有信息,然后查看其上的帮助文档python的Windows API.这是我最近正在研究的项目中使用api的示例.实际上,只要稍加修改,它就可以完成您想要的一些事情.您可能希望专注于CreationFlags.特别是,win32process.DETACHED_PROCESS通常被用来在后台执行控制台程序.还有许多其他标志可以使用,并且可以方便地包装.

    if subprocess.mswindows:
        su=subprocess.STARTUPINFO()
        su.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
    process = subprocess.Popen(['program', 'flag', 'flag2'], bufsize=-1,
              stdout=subprocess.PIPE, startupinfo=su)
上一篇:将C#编译为CGI


下一篇:Python CGI编程Ⅷ