python CGI无需等待即可调用新的子进程

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (224)

我在这里阅读了各种帖子,关于在CGI调用的内部启动另一个python脚本的问题,即我在启用了CGI的Raspberrypi上运行了一个apache2服务器。

1)从浏览器:webform数据被发送到CGI接口,它调用我的python脚本 test1.py

2)从test1.py我想要打电话test2.py(这将永远运行或在任何需要的时间运行(它在某处不断更新值)

3)重点是:我希望CGI脚本立即显示一些结果让我们在“结果网页”上说“test2已经启动”并在后台运行我的 test2.py

然而,发生的事情是,带有表单的网页只是等待我的test2.py完成!

我尝试过这样的事情:

p = subprocess.Popen([sys.executable, '/var/www/cgi-bin/test2.py'],
                     stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

但这不起作用(即等待脚本test2完成...)

有人可以帮忙吗?

提问于
用户回答回答于

谢谢这是一个很好的答案!

我刚刚将它添加到我的脚本test1.py(atm在test2.py中没有函数只是原始代码):

[...] import test2 cgitb.enable()

T1 = threading.Thread(test2)T1.start()

[...]

然而,网页仍然等待永远,虽然我注意到测试2确实由线程启动...你知道如何使网页显示而不是等待?

请注意,我也尝试过:

pid = os.fork()
#if pid==0 then we are in the child process
if(pid==0):
    T1 = threading.Thread(test2)
    T1.start()
    #i would hope that here the child process is detached from making wait the CGI!! but no
else:
    print('Content-type: text/html\n\n')
    print('<h1>Python Script Test</h1>')
    form = cgi.FieldStorage()
    tempThVal = form['tempThresh'].value
    print('Temperature threshold= ' + tempThVal)

但该死的浏览器还在等待它完成!!

用户回答回答于

要解决此问题,您可以将自己的解决方案与我的答案结合起来,以获得正确的答案。

#in test1.py

class my_thread(threading.Thread):
    def __init__(self):
        super().__init__()

    def run(self):
        p = subprocess.Popen([sys.executable, '/var/www/cgi-bin/test2.py'],
                 stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        ########################
        #or your test2 statment#
        ########################
pid = os.fork()
#if pid==0 then we are in the child process
if(pid==0):
    T1 = my_thread()
    T1.start()
#i would hope that here the child process is detached from making wait the CGI!! but 
no
else:
   print('Content-type: text/html\n\n')
   print('<h1>Python Script Test</h1>')
   form = cgi.FieldStorage()
   tempThVal = form['tempThresh'].value
   print('Temperature threshold= ' + tempThVal)

我用这种方法在Django框架中解决了这个问题

扫码关注云+社区

领取腾讯云代金券