簡體   English   中英

如何從運行在 ubuntu 上的 Apache 提供的 python 腳本生成一個長時間運行的 python 進程?

[英]How can I spawn a long running python process from a python script served by Apache running on ubuntu?

到目前為止,我發現的一切都是好的,前提是它沒有在網絡環境中使用。

我有一個在 Apache 中運行的簡單 python“管理工具”Web 應用程序,並且我在 vhost 中使用了簡單的配置:

AddHandler cgi-script .py.

不需要高性能,也沒有 python 框架。 用戶選擇某些條件,這些條件通過 GET 請求發送到服務器和 python 腳本,然后由 apache 調用並編譯報告。 問題是報告的復雜度越來越高,編譯這個報告所需的時間可能超過 20 分鍾,所以我想生成一個新的完全獨立的進程來異步生成報告,允許服務器快速返回給客戶端.

我的問題是我已經嘗試了所有我能找到的方法來做到這一點,但一切都以同樣的方式失敗; 當我生成一個新進程時,父腳本在新進程完成之前不會返回到客戶端。

所有這些都完全相同 - 它們啟動一個新進程,但主腳本在返回客戶端之前等待子進程完成。 我希望主腳本直接返回給客戶端,並讓新生成的進程繼續運行以編譯報告。

os.system("""
cd /the_directory
python -m web.wait &
""")
command = ['python', '/the_directory/wait.py &']
Popen(command, shell=True, start_new_session=True)
L = ['python', '/the_directory/wait.py']
os.spawnvp(os.P_NOWAIT, 'python', L)
L = ['test.sh']
os.spawnvpe(os.P_NOWAIT, '/the_directory/test.sh', L, os.environ)


where test.sh contains: 

#!/bin/sh
/the_directory/wait.py &
jobs = []
for i in range(5):
    p = multiprocessing.Process(target=wait.dostuff, )
    jobs.append(p)
    p.start()

我想要最簡單的解決方案 - 它是一個管理工具,僅由我為極少數用戶維護。

如果真的沒有辦法做到這一點,那么我想我將不得不使用每分鍾運行一次的 cron 並使用一個簡單的隊列,也許使用 redis 或其他東西,但這並不理想。

我曾經在 php 中相對容易地做這種事情,我不敢相信在 python 中這是不可能的。

您可以將Popenshell=False

例子:

Popen(["bash", "test.sh"], shell=False)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM