2

Web インターフェイス (Flask) から開始するかなり大きなデータベース インポート ジョブがあります。データベースのインポートをトリガーする URL にアクセスすると、データベースの挿入を行う前に fork します。

問題は、Web サービスを停止しようとすると (組み込みの開発サーバーで Ctrl+C)、代わりに子プロセスが停止し、Web サーバーがバックグラウンドで実行され続けることです。どういうわけか、子プロセスが現在プライマリプロセスである間に、Web サーバージョブが突然バックグラウンドデーモンになるようにプッシュされているように見えます。

私が達成したいのは、「子プロセスを開始してからそれを忘れる」アプローチであり、Web サーバーが子プロセスを開始するだけで、特に例外などに関しては二度と気にしません。

これをどのように解決するのが最善かについてのアイデアはありますか?

現在、インポート機能のテスト コードは次のとおりです。

def import_start():
    try:
            pid = os.fork()
    except OSError as e:
            print "Exception in import_start"
            sys.exit(1)
    if pid == 0:
          with open("/tmp/web_out.txt", "w") as f:
                for x in range(100):
                      f.write("line %d\n" % (x))
                      f.flush()
                      sleep(10)

コードはフラスコ ルート ハンドラで次のように開始されます。

import_start()

その後 Ctrl+C を使用すると、Web サーバーではなく import_start() プロセスが強制終了されます。起動後、2 つのプロセスは互いに完全に独立していなければならないため、逆にしたいと考えています。

アップデート:

私はやった:

def start_import():
            subprocess.Popen([sys.executable,__file__],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

def do_import():
    with open("/tmp/web_out.txt", "w") as f:
            for x in range(100):
                    f.write("line %d\n" % (x))
                    f.flush()
                    sleep(10)

if __name__ == "__main__":
    do_import()

これは機能します (Web サーバーが強制終了されたときに生成されたプロセスを強制終了することを除いて) が、何らかの方法でプロセスをクリーンアップしないことが少し心配です。これを解決するために MQ のアプローチを検討するかもしれませんが、これには新しいプロセスを生成するよりも複雑さが必要です。

4

1 に答える 1

3

python-daemonが役立つかもしれません。これは主に Python プログラムをデーモンとして起動するために使用されます。Afaik はダブル フォーク マジックを実行し、プロセスを現在のプロセスから切り離します。

于 2012-11-20T17:54:11.540 に答える