同じ長時間実行のPythonコマンドラインスクリプトの複数のインスタンスが同時に実行されないようにしたい。また、新しいインスタンスが自殺する前に、新しいインスタンスが元のインスタンスにデータを送信できるようにしたい。 。クロスプラットフォームの方法でこれを行うにはどうすればよいですか?
具体的には、次の動作を有効にします。
- "
foo.py
"はコマンドラインから起動され、マシンが再起動されるか、親プロセスがマシンを強制終了するまで、数日または数週間、長時間実行され続けます。 - 数分ごとに同じスクリプトが再度起動されますが、コマンドラインパラメータが異なります
- 起動すると、スクリプトは他のインスタンスが実行されているかどうかを確認する必要があります。
- 他のインスタンスが実行されている場合、インスタンス#2はコマンドラインパラメーターをインスタンス#1に送信してから、インスタンス#2を終了する必要があります。
- インスタンス#1は、別のスクリプトからコマンドラインパラメータを受け取った場合、新しいスレッドを起動し、(上記の手順で送信されたコマンドラインパラメータを使用して)インスタンス#2が実行しようとしていた作業の実行を開始する必要があります。
だから私は2つのことを探しています:Pythonプログラムがそれ自体の別のインスタンスが実行されていることをどのように知ることができますか、そして1つのPythonコマンドラインプログラムが別のプログラムとどのように通信できますか?
これをさらに複雑にするには、同じスクリプトをWindowsとLinuxの両方で実行する必要があるため、理想的には、ソリューションはPython標準ライブラリのみを使用し、OS固有の呼び出しは使用しません。Windowsコードパスと*nixコードパス(およびif
どちらかを選択するためのコード内の大きなステートメント)が必要な場合でも、「同じコード」ソリューションが不可能な場合は問題ありません。
私はおそらくファイルベースのアプローチを実行できることを理解しています(たとえば、インスタンス#1はディレクトリの変更を監視し、各インスタンスは作業を行いたいときにそのディレクトリにファイルをドロップします)が、それらのファイルのクリーンアップについて少し心配しています正常でないマシンのシャットダウン後。理想的には、メモリ内ソリューションを使用できると思います。しかし、繰り返しになりますが、永続ファイルベースのアプローチがそれを行う唯一の方法である場合、私はそのオプションを受け入れます。
詳細:サーバーがPythonスクリプトの実行をサポートする監視ツールを使用して監視データ(データベースクエリやWebサービス呼び出しの結果など)を収集し、後で使用するためにインデックスを作成しているため、これを実行しようとしています。これらのスクリプトの中には、起動に非常に費用がかかるものもありますが、起動後に実行するのは安価です(たとえば、DB接続の作成とクエリの実行)。そのため、親プロセスがそれらを強制終了するまで、それらを無限ループで実行し続けることを選択しました。
これはうまく機能しますが、大規模なサーバーでは、それぞれ20分ごとにデータを収集している場合でも、同じスクリプトの100個のインスタンスが実行されている可能性があります。これは、RAM、DB接続制限などに大混乱をもたらします。1スレッドの100プロセスから100スレッドの1プロセスに切り替えて、それぞれが以前は1つのスクリプトで実行していた作業を実行します。
ただし、監視ツールによるスクリプトの呼び出し方法を変更することはできません。呼び出しを同じに保つ必要があります(異なるコマンドラインパラメーターでプロセスを起動します)が、別のスクリプトがアクティブであることを認識するようにスクリプトを変更し、「新しい」スクリプトに(コマンドラインパラメーターからの)作業指示を送信させます「古い」スクリプトに。
ところで、これは私が1スクリプトベースでやりたいことではありません。代わりに、この動作を多くのスクリプト作成者が利用できるライブラリにパッケージ化したいと思います。私の目標は、スクリプト作成者がマルチインスタンスの問題を認識しない単純なシングルスレッドスクリプトを記述し、マルチスレッドを処理できるようにすることです。カバーの下でシングルインスタンス化。