1

Python で機械の自動化を行おうとしていますが、問題が発生しました。

実際の制御を行うコード、ログを記録するコード、GUI を提供するコード、および単一のスクリプトからすべて呼び出される他のいくつかのモジュールがあります。

問題は、1 つのモジュールでエラーが発生すると、他のすべてのモジュールが停止することです。たとえば、GUI のバグによって制御システムが停止します。

モジュールを独立して実行できるようにしたいので、他のモジュールを停止することなく、クラッシュ、再起動、パッチ適用などを行うことができます。

それを機能させる唯一の方法は、変数をSQLデータベース、またはファイルなどに保存することです。

1 つの python スクリプトが別の ..debug をソートする方法はありますか? あるスクリプトが他のスクリプトの変数を読み取ったり変更したりできるようにするにはどうすればよいですか? スクリプトを個別に開始および停止できるようにする方法が見つかりません。

誰かアイデアやアドバイスはありますか?

4

2 に答える 2

1

これを行うかなり効果的な方法は、メッセージ パッシングを使用することです。各モジュールは独立していますが、互いにメッセージを送受信できます。Python でこれを実現するための多くの方法に関する非常に優れた参考文献は、 Python wiki page for parallel processingです。

一般的な戦略

サーバーとクライアントがある部分にプログラムを分割します。次に、0MQ、Apache ActiveMQ、RabbitMQ などのミドルウェアを使用して、システムのさまざまな部分間でデータを送信できます。

この場合、GUI はログ パーサー サーバーにメッセージを送信して、処理を開始するように指示します。処理が完了すると、ログ パーサーは、関心のある人にブロードキャスト メッセージを送信し、結果への参照を世界中に伝えます。GUI は、ログ パーサーがサブスクライブするチャネルのサブスクライバーである可能性があります。メッセージを受信すると、結果ファイルを開き、ユーザーが興味を持っているものを表示します。

シリアライゼーションとデシリアライゼーションの速度も重要です。通信のオーバーヘッドを最小限に抑えたい。ここでは、Google Protocol Buffers と Apache Thrift が効果的なツールです。

また、サーバーの 1 つに障害が発生してすべてがブロックされるのを防ぐために、何らかの監視戦略も必要になります。Supervisord は自動的に再起動し、構成は非常に簡単です。繰り返しますが、これはこの分野の多くの選択肢の 1 つにすぎません。

やり過ぎ?

シンプルなユーティリティを作成したようです。multiprocessing モジュールは、プログラムのさまざまな部分をかなり独立して実行するための優れた方法です。同じ戦略 (メッセージの受け渡し、共有状態の共有なし、監視) を適用しますが、戦術は異なります。

于 2012-10-13T00:31:42.187 に答える
0

独立したプロセスを増やし、それらが互いに対話することを望んでいます。したがって、OS で使用できるプロセス間通信の方法を確認してください。ソケットをお勧めします (一般的で、an/w および diff OS で動作します)。メッセージ用のjsonを使用して、TCP の上に単純な (おそらく http のような) プロトコルを簡単に作成できます。簡単にするために Python ディストリビューションに付属している一連のクラスがあります (SocketServer.ThreadingMixIn、SocketServer.TCPServer など)。

于 2012-10-13T02:38:23.897 に答える