1C Enterprise環境での並列アルゴリズムの適用

おそらく、私たちはそれぞれ、限られた時間内に大量の計算を実行したり、大量の情報を送受信したりする必要がある状況に直面していました。 そして、私たちの何人がシーケンシャルアルゴリズムに落ち着き、実行の期間に目をつぶったのでしょうか? それでは、データの計算/送信/受信(必要な下線)は何時間ですか? まあ、私はシステムから可能なすべてのものを「絞り出した」、それはより速く動作しません...同時に、サーバーのハードウェアは最小限にロードされます。

実際、実行中のタスクの並列化という形で、ほとんど常に代替手段が利用可能です。 もちろん、並列アルゴリズムはもう少し複雑です-負荷分散、スレッド間の同期、共有リソースの場合、ロック待機との戦い、デッドロックの回避。 しかし、原則として、それは価値があります。

本日は、1C Enterpriseのコンテキストで説明します。

ほとんどすべての現代言語には、並列処理を実装するために必要なツールがあります。 しかし、どこでもこのツールキットが使いやすいとは限りません。 誰かが言うだろう:「まあ、何がそんなに複雑で便利ではないのですか? バックグラウンドタスクのプラットフォームメカニズムを手に入れて実行します!」 実際には、それはそれほど単純ではありませんでした。 しかし、タスクがビジネスに不可欠な場合はどうでしょうか? 次に、まずタスクの完了を保証し、次にタスク実行のサブシステムの動作を監視する必要があります。

バックグラウンドジョブエンジンはこれを提供しません。
背景はいつでも「落ちる」可能性があります。 考えられる状況のほんの一部のリストを次に示します。

バックグラウンドの作業を監視し、問題を修正し、再実行のために「落ちた」タスクを設定する必要があることがわかりました。 制御シナリオを自動化せずに、この良いものを手動で制御し、穏やかに言えば、それは「喜び」です。

エラーを考慮し、起動を保証し、他の言語や並列タスクのフレームワークに存在するのとほぼ同じ簡単さで、フィードバックを使用して起動タスクを柔軟に管理できるようにしたいと思います。

自分自身の生活を促進するために、バックグラウンドタスクに基づいて1C Enterprise環境での実行を保証する並列アルゴリズムを簡単に作成できるユニバーサルライブラリが開発されました。

応用分野



仕事の基本原則


画像

タスクは非常に簡単に追加されます-エントリポイント(一般モジュールまたはマネージャーモジュールのサーバーコンテキストでのエクスポートメソッドへのパス)と、構造の形式のパラメーターを持つタプルを指定する必要があります。

.(".",  ("", 3)); 

この場合、タスクの情報レジスタにエントリが作成されます。 最初、タスクのステータスはPendingです。 このメソッドは、メインクライアントスレッドの進行状況を追跡するためのタスクキーを返します。 パラメーターを含むタプルもTaskKeyプロパティによって展開されるため、タスクが実行されるときにコンテキストが存在する場合に役立つことがあります。

その後、1分に1回、マネージャーが起動します。マネージャーはまず実行者をチェックし、実行者が「死亡」したタスクをリリースします。 検証は次のとおりです。 タスクが実行状態にあり、エグゼキュータとして指定されたバックグラウンドがアクティブでない場合(管理者によって削除された、コードで例外が発生したなど)、タスクはキューに返されます。 これを行うには、タスクを保留中に設定します。

次のステップは、負荷分散の設定に従ってジョブキューから要求されます(これは、同時に動作する実行者の数の制限に過ぎません)。

その後、マネージャーは各タスクの請負業者を起動します。 パフォーマーは、1Cプラットフォームのバックグラウンドタスクです。

起動時に、請負業者は仕事に取りかかったことをメモします。請負業者のプロパティでタスクの一意の識別子を規定し、タスクのステータスを実行中に設定します。

タスクが完了すると、請負業者もタスクに適切なマークを付けます。ステータスはCompletedです。

サブシステムをオンラインモードで使用するには、AddTask Out of Queueメソッドがあります。 この場合、請負業者はマネージャーをバイパスしてすぐに起動し、新しいタスクを取得します。 署名は、メインのAddJobメソッドと同じです。 このようなタスクの場合、実行者の数の制限は適用されませんが、クォータが使用されます。

[ジョブのキャンセル]メソッドを使用して、キュー内のジョブをキャンセルすることもできます。 この場合、 保留状態のタスクのみをキャンセルできます。 次の理由により、すでに実行中のタスクはキャンセルされません。
  1. バックグラウンドジョブにはキャンセル方法があるように見えますが、私には透過的に機能しません。 キャンセルコマンドが送信されたにもかかわらず、長いバックグラウンドタスクが最後まで完了したとき、私は非常に頻繁に写真を見ました。
  2. システムを一貫性のない状態にしたくない。 タスクコードがどのように記述され、データベースで何が行われるのか、誰が正確に知っていますか?

便利なワークフロー管理のために、次のメソッドが提供されています。

上記に基づいて、タスクのライフサイクルは次のとおりです。

画像

カスタマイズ


カスタマイズのために、特別な処理「タスクマネージャー管理」があります。

画像

利用可能な設定:

サブシステムの起動、キューの停止および消去は、上部のわかりやすいボタンで実行されます。
サブシステムのインジケータとして、Manager is runningフラグが表示されます。

システムがタスクにどのように対処するかを示すことができる表面的な監視もあります。 指標:
  1. アクティブなパフォーマーの数。
  2. キュー内のジョブの数( 保留状態)。
  3. アクティブなタスクの合計(p。1 + p。2)。

インジケータは1分に1回自動的に更新されます。 適切なボタンをクリックして、明示的に更新できます。 必要に応じて、タスクの登録を調べることができます。 そこには、タスクが実行された時間と完了までにかかった時間を確認できます。また、タスクを完了しようとした回数のカウンターもあります。

高度な監視はアプリケーションに大きく依存しており、サブシステムの利用者に任されています。

使用例


ビジネスプロセスの自動化における並列コンピューティングの使用

たとえば、ある従業員の給与は原則として別の従業員の給与に依存しないため、従業員の給与を並列化できます。 (指定されたコードは、サブシステムの機能のみを示しており、一般的な1C構成に関連付けられているわけではありません。)

  ()   = ();  =  (", ", );       . = ;  = .("..", ); ;  

長いレポート/処理でのクエリの並列実行

  ()   =  ; .(.("..", )); .(.("..", )); .(.("..", ));  = .();     = (); ();  ("   ,         "" """); .("..",  ("", )); ;  

データのアップロード/ダウンロードプロセス

  ()   = ();  =  ("");       . = ;  = .("..", ); ;  

ストレステストの構成

  ()   =  ();   = 1  10000   = .(0, .());  = [];  = .("..", ); ;  

ソースともの


サブシステムはgithub / TaskManagerFor1Cで利用可能です。 CFファイルは開いているので、ソースコードに慣れることができます。

サブシステムはテスト(TDD)によって開発され、テストはAssignments.epfの外部処理/ Tests / Tests_Managerで利用できます。 テストを実行するには、 xUnitFor1Cツールキットが必要です。

フィードバックは大歓迎です。 楽器に関するすべての質問に喜んでお答えします。

Source: https://habr.com/ru/post/J255387/


All Articles