(57)【要約】【課題】処理要求を分割して複数の処理ノードに分散出力する中央処理ノードを用いずに、処理要求に関する処理を複数の処理ノードで並列実行する。【解決手段】第１処理ノード１２ａの判定部４０は、ジョブに含まれる関数の中に、自処理ノードの処理エンジン３８で実行可能な関数があるか否かを判定する。当該ジョブに自処理ノードの処理エンジン３８で実行不可能な関数が含まれている場合、部分ジョブ送信処理部４２は、当該ジョブの残部分からなる部分ジョブを他の処理ノード１２に送信する。他の処理ノード１２は、部分ジョブのうち自処理ノードで実行可能な関数を実行して、処理結果を当該部分ジョブの送信元の処理ノード１２に送信する。部分ジョブに自処理ノードで実行不可能な関数が含まれている場合には、当該部分ジョブの残部分からなる、さらなる部分ジョブをさらに他の処理ノード１２に送信する。【選択図】図６
2020038532.tif 000002
【特許請求の範囲】
【請求項１】
それぞれ異なる処理を実行可能な複数の処理ノードを備え、
前記複数の処理ノードのうちの第１処理ノードは、複数の処理の実行を要求する入力処理要求を受け付け、前記入力処理要求が要求する複数の処理のうち前記第１処理ノードで実行可能な処理を実行し、前記入力処理要求が要求する複数の処理のうち前記第１処理ノードで実行不可能な処理の実行を要求する部分処理要求を他の前記処理ノードに渡し、
前記第１処理ノード以外の各前記処理ノードは、受け付けた部分処理要求が要求する処理のうち自処理ノードで実行可能な処理を実行して、当該部分処理要求の送信元の前記処理ノードに処理結果を渡し、受け付けた部分処理要求が要求する処理のうち自処理ノードで実行不可能な処理の実行を要求する部分処理要求を他の処理ノードに渡し、
前記第１処理ノードは、前記複数の処理ノードにおける処理結果をまとめて前記入力処理要求の処理結果として出力する、
ことを特徴とする情報処理システム。
【請求項２】
各処理ノードは、前記複数の処理ノードのそれぞれが実行可能な処理を示すノード情報を参照可能であり、
各処理ノードは、前記ノード情報に基づいて、前記部分処理要求が要求する処理を実行可能な処理ノードに当該部分処理要求を渡す、
ことを特徴とする請求項１に記載の情報処理システム。
【請求項３】
各処理ノードは、前記部分処理要求が要求する処理を実行可能な処理ノードの処理負荷にさらに基づいて、当該部分処理要求を渡す先の処理ノードを決定する、
ことを特徴とする請求項２に記載の情報処理システム。
【請求項４】
前記入力処理要求及び部分処理要求は、各処理に対応する関数及び当該関数の複数の引数を含み、
各処理ノードにおいて、各引数についての前記関数の実行が並列に行われる、
ことを特徴とする請求項１に記載の情報処理システム。
【請求項５】
手続型言語で記載された前記入力処理要求を、関数型言語の前記入力処理要求に変換する変換部、
をさらに含むことを特徴とする請求項４に記載の情報処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システムに関する。
【背景技術】
【０００２】
特許文献１には、スキャン要求をクラウド印刷サービスに送信し、ドキュメントの画像を含む画像ファイルをクラウドドキュメントサービスから受信するシステムが開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第５８８５１１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
処理要求（例えば画像処理のための処理要求）、すなわちジョブを複数の処理ノードで分散処理させることが考えられる。ジョブを分散処理することで処理自体にかかる時間を短縮させることが可能となるが、分散処理を行うために、特定の処理ノード（中央処理ノード）において、ジョブを分割して複数の処理ノードに分散出力する処理を行うとすると、当該中央処理ノードがジョブ処理のボトルネックとなってしまう場合がある。
【０００５】
本発明の目的は、処理要求を分割して複数の処理ノードに分散出力する中央処理ノードを用いずに、処理要求に関する処理を複数の処理ノードで並列実行することにある。
【課題を解決するための手段】
【０００６】
請求項１に係る発明は、それぞれ異なる処理を実行可能な複数の処理ノードを備え、前記複数の処理ノードのうちの第１処理ノードは、複数の処理の実行を要求する入力処理要求を受け付け、前記入力処理要求が要求する複数の処理のうち前記第１処理ノードで実行可能な処理を実行し、前記入力処理要求が要求する複数の処理のうち前記第１処理ノードで実行不可能な処理の実行を要求する部分処理要求を他の前記処理ノードに渡し、前記第１処理ノード以外の各前記処理ノードは、受け付けた部分処理要求が要求する処理のうち自処理ノードで実行可能な処理を実行して、当該部分処理要求の送信元の前記処理ノードに処理結果を渡し、受け付けた部分処理要求が要求する処理のうち自処理ノードで実行不可能な処理の実行を要求する部分処理要求を他の処理ノードに渡し、前記第１処理ノードは、前記複数の処理ノードにおける処理結果をまとめて前記入力処理要求の処理結果として出力する、ことを特徴とする情報処理システムである。
【０００７】
請求項２に係る発明は、各処理ノードは、前記複数の処理ノードのそれぞれが実行可能な処理を示すノード情報を参照可能であり、各処理ノードは、前記ノード情報に基づいて、前記部分処理要求が要求する処理を実行可能な処理ノードに当該部分処理要求を渡す、ことを特徴とする請求項１に記載の情報処理システムである。
【０００８】
請求項３に係る発明は、各処理ノードは、前記部分処理要求が要求する処理を実行可能な処理ノードの処理負荷にさらに基づいて、当該部分処理要求を渡す先の処理ノードを決定する、ことを特徴とする請求項２に記載の情報処理システムである。
【０００９】
請求項４に係る発明は、前記入力処理要求及び部分処理要求は、各処理に対応する関数及び当該関数の複数の引数を含み、各処理ノードにおいて、各引数についての前記関数の実行が並列に行われる、ことを特徴とする請求項１に記載の情報処理システムである。
【００１０】
請求項５に係る発明は、手続型言語で記載された前記入力処理要求を、関数型言語の前記入力処理要求に変換する変換部、をさらに含むことを特徴とする請求項４に記載の情報処理システムである。
【発明の効果】
【００１１】
請求項１に係る発明によれば、処理要求を分割して複数の処理ノードに分散出力する中央処理ノードを用いずに、処理要求に関する処理を複数の処理ノードで並列実行することができる。
【００１２】
請求項２に係る発明によれば、ノード情報に基づいて、部分処理要求の渡し先の処理ノードを決定することができる。
【００１３】
請求項３に係る発明によれば、処理ノードの処理負荷も考慮して、部分処理要求の渡し先の処理ノードを決定することができる。
【００１４】
請求項４に係る発明によれば、単一の処理ノードにおいて、複数の引数についての関数の実行を並列に実行することができる。
【００１５】
請求項５に係る発明によれば、利用者は、情報処理システムに対して手続型言語で記載された入力処理要求を入力することができる。
【図面の簡単な説明】
【００１６】
【図１】本実施形態に係る画像処理システムの構成概略図である。
【図２】関数型のジョブの記載例を示す図である。
【図３】手続型のジョブの記載例を示す図である。
【図４】処理ノードの構成概略図である。
【図５】ノード情報の内容の例を示す図である。
【図６】部分ジョブが他の処理ノードに渡される様子と、部分ジョブの処理結果が部分ジョブの送信元の処理ノードに返される様子を示す概念図である。
【図７】第１処理ノードにおけるジョブ処理の流れを示すフローチャートである。
【図８】ｐｍａｐｌｉｓｔ関数の処理の流れを示すフローチャートである。
【図９】送信先処理ノードの決定処理の流れを示すフローチャートである。
【図１０】他の処理ノードにおける部分ジョブの処理の流れを示すフローチャートである。
【図１１】マージ関数の処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１７】
図１は、本実施形態に係る情報処理システムとしての画像処理システム１０の構成概略図である。画像処理システム１０は、複数の処理ノード１２、及び、利用者（ユーザ）が利用するユーザ端末１４を含んで構成される。複数の処理ノード１２とユーザ端末１４は、ＬＡＮあるいはインターネットなどを含むネットワーク（通信回線）１６を介して互いに通信可能に接続される。また、画像処理システム１０は、処理ノード１２とネットワーク１６を介して通信可能に接続された、画像を紙などの印刷媒体に形成する画像形成装置１８、あるいは、造形材を充填あるいは固形化することなどによって立体を造形する出力装置２０などを含んでいてもよい。
【００１８】
画像処理システム１０は、入力処理要求としてのジョブをユーザから受け付け、複数の処理ノード１２において当該入力ジョブを分散処理するシステムである。ジョブとしては、例えば、画像形成装置１８において印刷処理を行わせる印刷ジョブなどの画像処理に関するジョブであるが、ジョブの種類としてはこれには限られない。詳しくは後述するが、複数の処理ノード１２は、それぞれ異なる種類の処理を実行可能となっている。換言すれば、複数の処理ノード１２は、それぞれ異なる機能を発揮可能となっている。例えば、ある処理ノード１２は、面付け処理が可能であるが画質改善処理が不可能である一方、他の処理ノード１２は画質改善処理が可能であるが面付け処理が不可能である、の如くである。なお、画像処理システム１０においては、種々の機能を有する処理ノード１２が動的に追加あるいは削除されてもよい。各処理ノード１２の構成概要については後述する。
【００１９】
ユーザ端末１４は、例えばパーソナルコンピュータあるいはタブレット端末などの一般的なコンピュータである。ユーザ端末１４は、ＲＯＭ、ＲＡＭ、あるいはハードディスクなどから構成される記憶部、通信モジュールなどから構成される通信部、マウス、キーボード、あるいはタッチパネルなどから構成される入力部、液晶パネルなどから構成される表示部、及び、ＣＰＵなどから構成される制御部などを含んで構成される。
【００２０】
ユーザは、ユーザ端末１４を用いて、複数の処理ノード１２のいずれかに対してジョブを送信する。ユーザ端末１４からジョブを受け付けた処理ノード１２を「第１処理ノード１２ａ」と記載する。
【００２１】
ジョブは、処理対象のジョブデータあるいは当該ジョブデータに対する各種処理の実行命令などを含むプログラムである。本実施形態のジョブは、複数種類の処理の実行を要求するものとなっている。具体的には、ジョブは、複数種類の処理に対応する複数種類の関数と、各関数に関する１又は複数の引数を含む関数型の言語で記載されている。換言すれば、各処理ノード１２は、関数型のジョブを処理可能となっている。
【００２２】
図２に、関数型のジョブの記載例が示されている。図２の例では、ジョブは、印刷、ＰＤＦ連接Ａ、ｐｍａｐｌｉｓｔ（ＰＤＦＲＩＰ）、ｐｍａｐｌｉｓｔ（画質改善）、ＰＤＦ分割Ａ、及びＰＳｔｏＰＤＦ変換の関数から構成されており、各関数にそれぞれ引数が設定されている。
【００２３】
なお、図２のジョブには、ネットワーク上のfile://..../PDL.psというＵＲＬで指定される、ページ記述言語（PostScript）で記述されたページ記述言語（ＰＤＬ）データを読み込み、当該ＰＤＬデータをＰＤＦ形式に変換した上で１００ページ毎に分割し、１００ページ毎にＲＩＰ処理を並列に実行し、複数のＲＩＰ処理の処理結果を１つにまとめ、画質改善処理を行った上で、画像形成装置１８（プリンタｎ）で印刷する、という手順が記述されている。
【００２４】
好適には、ジョブは、型システムによる型チェックや、値の型変換、名前束縛などを、コンパイルなどの実行準備時ではなく実行時に行う動的プログラミング言語で記載されるのが好ましい。
【００２５】
また、画像処理システム１０は、手続型言語で記載されたジョブを関数型言語のジョブに変換する変換部（詳細後述）を有していてもよく、その場合は、ユーザは、画像処理システム１０に対して手続型言語で記載されたジョブを入力することができる。図３に、手続型のジョブの記載例が示されている。手続型言語とは、記載されたプログラムを所定の順序で順次処理していくプログラムである。図３に示された手続型のジョブの内容は、図２に示した関数型のジョブと同じである。
【００２６】
図４は、処理ノード１２の構成概略図である。各処理ノード１２は、例えばサーバなどのコンピュータにより構成される。複数の処理ノード１２はクラウドサーバであってよく、物理的に隔離した場所に設置されていてもよい。
【００２７】
通信部３０は、例えばネットワークアダプタなどを含んで構成される。通信部３０は、ネットワーク１６を介して、他の処理ノード１２、ユーザ端末１４、画像形成装置１８、あるいは出力装置２０などと通信する機能を発揮する。
【００２８】
記憶部３２は、例えばＲＯＭ、ＲＡＭ、あるいはハードディスクなどを含んで構成される。記憶部３２には、処理ノード１２の各部を動作させるためのプログラムが記憶される。さらに、図４に示すように、記憶部３２には、ノード情報３４が定義される。
【００２９】
ノード情報３４は、画像処理システム１０に含まれる複数の処理ノード１２のそれぞれが実行可能な処理を示すものである。本実施形態では、ノード情報３４には、各処理ノード１２が実行可能な関数が示されている。図５に、ノード情報３４の内容の例が示されている。本実施形態では、ノード情報３４はテーブル形式となっており、各行が、画像処理システム１０で処理可能なジョブに含まれ得る各関数を示し、各関数に対して、当該関数を実行可能な処理ノード１２が関連付けられている。例えば、面付け関数には、複数の処理ノード１２のうち、「処理ノード０」及び「処理ノード２」が関連付けられており、これは、処理ノード０及び処理ノード２が面付け関数を実行可能であることを示す。なお、各処理ノード１２には、処理ノード１２を一意に識別し、且つ、処理ノード１２の順序を示す識別子が付与されている。本実施形態では、各処理ノード１２に「１」あるいは「２」などの数字が付与されている。ノード情報３４においても、各処理ノード１２に付された識別子によって、各関数に対して各処理ノード１２が識別可能に関連付けられている。
【００３０】
ノード情報３４は複数の列を有しており、例えば、各列は、対応処理ノード１あるいは対応処理ノード２などと定義されている。対応処理ノード１、２、３・・・は、１つの関数に対する処理ノード１２の関連付けの順序を示すものである。１つの関数を複数の処理ノード１２が実行可能である場合、ノード情報３４においては、当該１つの関数に対して、所定の順序で当該複数の処理ノード１２が関連付けられる。本実施形態では、処理ノード１２に付与された数字順に関連付けられる。例えば、上述の面付け関数に対しては、対応処理ノード１（１番目の順序）として、付与された数字がより小さい「処理ノード０」が関連付けられ、対応処理ノード２（２番目の順序）として、付与された数字が次に小さい「処理ノード２」が関連付けられている。対応処理ノード３（３番目の順序）の欄が空欄であることは、当該関数を実行可能な処理ノード１２がそれ以上ない、すなわち２つである、ことを示している。ここで、空欄に代えて、当該関数を実行可能な処理ノード１２がそれ以上ないことを示す識別子が書き込まれてもよい。
【００３１】
複数の処理ノード１２は、それぞれ、内容が同一のノード情報３４を有している。画像処理システム１０において、処理ノード１２が追加あるいは削除された場合、各処理ノード１２が有するノード情報３４が更新される。例えば、各処理ノード１２が、間欠的に自処理ノードで実行可能な関数を示す情報をブロードキャストすることで、各処理ノード１２はノード情報３４を更新し、所定期間当該情報が発信されなかった処理ノード１２を削除されたと判断することができる。
【００３２】
なお、本実施形態では、各処理ノード１２がノード情報３４を有していたが、ノード情報３４は他の装置（例えば各処理ノード１２がアクセス可能なサーバなど）に記憶されており、各処理ノード１２が当該他の装置に記憶されたノード情報３４を参照するようにしてもよい。
【００３３】
制御部３６は、例えばＣＰＵなどを含んで構成される。制御部３６は、記憶部３２に記憶されたプログラムに従って、処理ノード１２の各部を制御する。また、図４に示されるように、制御部３６は、処理エンジン３８、判定部４０、部分ジョブ送信処理部４２、及び変換部４４としても機能する。
【００３４】
処理エンジン３８は、ジョブに対する処理を実行する。本実施形態では、処理エンジン３８は、ジョブで指示されている関数を実行する。上述のように、各処理ノード１２は、それぞれ異なる関数を実行可能となっているため、処理ノード１２によって処理エンジン３８が実行する関数は異なる。例えば、図５に示されたノード情報３４に従えば、処理ノード０の処理エンジン３８は面付け関数を実行し、処理ノード１の処理エンジン３８はＰＤＦ分割Ａ関数を実行し、処理ノード２の処理エンジン３８は面付け関数及びＰＤＦ連接関数を実行する。処理ノード２のように、１つの処理ノード１２の処理エンジン３８が複数の関数を実行可能となっていてよい。
【００３５】
また、ジョブ解釈系の関数（例えばＣｏｎｔｅｎｔｓ関数あるいはＥｘｅｃ関数）及び並列処理に関する関数（例えばｐｍａｐｌｉｓｔ関数）は全ての処理ノード１２の処理エンジン３８が実行可能となっている。
【００３６】
判定部４０は、入力されたジョブに含まれる関数の中に、自処理ノードの処理エンジン３８で実行可能な関数があるか否かを判定する。また、判定部４０は、ノード情報３４に基づいて、入力されたジョブに含まれる関数を実行可能な他の処理ノード１２を特定する。
【００３７】
入力されたジョブに含まれる複数の関数のうち、自処理ノードの処理エンジン３８で実行可能な関数がある場合、自処理ノードの処理エンジン３８は当該関数を実行する。
【００３８】
ここで、好適には、当該実行可能な関数が複数の引数を含む場合、処理エンジン３８は、各引数についての当該関数の実行を並列に行うようにしてもよい。各引数についての関数の並行処理の詳細については後述する。
【００３９】
部分ジョブ送信処理部４２は、入力されたジョブに、自処理ノードの処理エンジン３８で実行不可能な関数が含まれている場合、ジョブの一部分であって、自処理ノードで実行可能な関数及びその引数以外の残部分からなる部分処理要求としての部分ジョブを他の処理ノード１２に送信する。
【００４０】
ここで、本実施形態では、部分ジョブ送信処理部４２は、判定部４０の処理結果、すなわちノード情報３４に基づく、自処理ノードで実行不可能な関数を実行可能な他の処理ノード１２の特定処理の結果に基づいて、部分ジョブに含まれる関数を実行可能な他の処理ノード１２に当該部分ジョブを送信する。部分ジョブに複数の関数が含まれている場合には、当該複数の関数のうち、少なくとも１つの関数を実行可能な他の処理ノード１２に当該部分ジョブを送信する。
【００４１】
また、判定部４０が、部分ジョブに含まれる関数を実行可能な他の処理ノード１２の処理負荷にさらに基づいて、当該部分ジョブの送信先の処理ノード１２を決定するようにしてもよい。例えば、部分ジョブに含まれる関数を実行可能な他の処理ノード１２の処理負荷が、当該処理ノード１２の処理能力に対する所定量を超えている場合には、部分ジョブ送信処理部４２は、当該処理ノード１２には部分ジョブを送信せず、部分ジョブに含まれる関数を実行可能な他の処理ノード１２であって処理負荷に余裕のある（すなわち処理負荷が当該処理ノード１２の処理能力に対する所定量以下である）別の処理ノード１２に部分ジョブを送信するようにしてもよい。
【００４２】
なお、各処理ノード１２は、自処理ノードの処理負荷を示す情報を間欠的にブロードキャストすることで、各処理ノード１２は、他の処理ノード１２の処理負荷を取得することができる。他の各処理ノード１２の処理負荷を示す情報は記憶部３２に記憶させておいてよい。
【００４３】
また、判定部４０が部分ジョブに含まれる関数を実行可能か否かを判定することなく、すなわちノード情報３４に依らずに、部分ジョブ送信処理部４２が他の処理ノード１２に部分ジョブを送信するようにしてもよい。例えば、付与された識別子（本実施形態では数字）が自処理ノードの次の順序を示す処理ノード１２に部分ジョブを送信するようにしてもよい。例えば、処理ノード０が部分ジョブを処理ノード１に送信する、の如くである。この場合、部分ジョブを受け取った処理ノード１２は、部分ジョブ内に自処理ノードで実行可能な関数が全くない場合があるが、その場合は、当該処理ノード１２は、当該部分ジョブをそのままさらに別の処理ノード１２に転送する。
【００４４】
部分ジョブを受け取った他の処理ノード１２の判定部４０は、部分ジョブに含まれる関数の自処理ノードにおける実行可否を判定する。その上で、部分ジョブに含まれる、自処理ノードで実行可能な関数については自処理ノードで実行し、その処理結果を当該部分ジョブの送信元の処理ノード１２に送信する。部分ジョブに自処理ノードで実行不可能な関数が含まれている場合には、当該処理ノード１２の部分ジョブ送信処理部４２は、自処理ノードで実行可能な関数及びその引数以外の残部分からなる、さらなる部分ジョブをさらに別の処理ノード１２に送信する。
【００４５】
このように、画像処理システム１０においては、各処理ノード１２は、受け取ったジョブあるいは部分ジョブのうち、自処理ノードで実行可能な関数のみを実行した上で、当該ジョブあるいは部分ジョブの残りの部分であってその他の関数及びその引数からなる部分ジョブを他の処理ノード１２に送信するという処理を行っていく。部分ジョブに含まれる関数を処理した処理ノード１２は、当該部分ジョブの送信元の処理ノード１２にその処理結果を送信する。これにより、最終的に、全ての関数の処理結果が、初めにジョブを受け付けた第１処理ノード１２ａに集約される。図６に、その様子が概念的に示されている。
【００４６】
第１処理ノード１２ａは、第１処理ノード１２ａの処理エンジン３８が処理した処理結果と、１又は複数の他の処理ノード１２における１又は複数の処理結果とをまとめて、ユーザが入力したジョブの処理結果として出力する。当該処理結果は、そのままユーザ端末１４に返されてもよいし、画像形成装置１８あるいは出力装置２０に出力されて、画像形成装置１８における印刷処理あるいは出力装置２０における立体造形処理が行われもよい。
【００４７】
変換部４４は、手続型言語で記載されたジョブを関数型言語のジョブに変換する。ユーザ端末１４から手続型言語で記載されたジョブが入力された場合には、第１処理ノード１２ａの変換部４４が当該ジョブを関数型言語のジョブに変換する。なお、本実施形態では、処理ノード１２に変換部４４が設けられているが、変換部４４は、画像処理システム１０に含まれる他の装置（サーバなど）に設けられていてもよい。
【００４８】
画像処理システム１０の構成概要は以上の通りである。以下、図７から図１１に示されたフローチャートに従って、画像処理システム１０の処理の詳細及び流れを説明する。
【００４９】
図７は、ジョブを受け取った第１処理ノード１２ａにおけるジョブ処理の流れを示すフローチャートである。
【００５０】
ステップＳ１０において、第１処理ノード１２ａは、ユーザ端末１４からジョブを受け付ける。受け付けたジョブが手続型言語で記載されたものである場合、変換部４４は当該ジョブを関数型言語のジョブに変換する。
【００５１】
ステップＳ１２において、判定部４０は、ステップＳ１０で受け付けたジョブに、処理エンジン３８が実行可能な関数が含まれるか否かを判定する。実行可能な関数が含まれる場合にはステップＳ１４に進み、実行可能な関数が含まれない場合には、ステップＳ１４をバイパスしてステップＳ１６に進む。
【００５２】
ステップＳ１４において、処理エンジン３８は、ステップＳ１０で受け付けたジョブに含まれる関数のうち実行可能な関数を実行し、その処理結果を保持しておく。ここで、当該関数が複数の引数を有している場合には、処理エンジン３８は、各引数についての当該関数の実行を並列に行う。各引数についての関数の並列処理の流れが図８に示されているが、その詳細については後述する。
【００５３】
ステップＳ１６において、判定部４０は、ステップＳ１０で受け付けたジョブに、処理エンジン３８が実行不可能な関数が含まれるか否かを判定する。実行不可能な関数が含まれない場合、すなわち、ステップＳ１０で受け付けたジョブに含まれる全ての関数が処理エンジン３８で実行可能な場合にはステップＳ２６に進み、その処理結果を出力して処理を終了する。実行不可能な関数が含まれる場合にはステップＳ１８に進む。
【００５４】
ステップＳ１８において、部分ジョブ送信処理部４２は、ステップＳ１０で受け付けたジョブのうち、ステップＳ１４で実行された関数及びその引数以外の残部分からなる部分ジョブの送信先の処理ノード１２を決定する。部分ジョブの送信先の処理ノード１２の決定処理の流れが図８に示されているが、その詳細については後述する。
【００５５】
ステップＳ２０において、部分ジョブ送信処理部４２は、ステップＳ１８で決定した送信先の処理ノード１２に部分ジョブを送信する。部分ジョブを受け付けた送信先の処理ノード１２の処理の流れが図１０に示されているが、その詳細については後述する。
【００５６】
ステップＳ２２において、第１処理ノード１２ａは、ステップＳ１８で決定した送信先の処理ノード１２から、１又は複数の処理ノード１２において処理された１又は複数の部分ジョブの処理結果を受信する。
【００５７】
ステップＳ２４において、処理エンジン３８は、第１処理ノード１２ａにおける処理結果と、１又は複数の他の処理ノード１２における１又は複数の部分ジョブに対する処理結果をまとめる。複数の処理結果をまとめる処理の流れが図１１に示されているが、その詳細については後述する。
【００５８】
ステップＳ２６において、処理エンジン３８は、ステップＳ２４でまとめられた処理結果を、ステップＳ１０で受け付けたジョブの処理結果として出力する。
【００５９】
次に、図８に示すフローチャートを参照しながら、図７のフローチャートにおけるステップＳ１４の処理、すなわち各引数についての関数の並列処理の流れを説明する。本実施形態では、各引数についての関数の並列処理は、ｐｍａｐｌｉｓｔ関数で実現される。図８に示されるｐｍａｐｌｉｓｔ（ｌ，ｆ）とは、複数の引数からなる引数リストｌについての関数ｆの並列処理を行う関数を意味する。つまり、ｐｍａｐｌｉｓｔ関数は、実行対象である関数自体とその引数リストとを引数として有する。
【００６０】
ステップＳ３０において、処理エンジン３８は、引数リストｌが空のリストであるか否かを判定する。関数ｆが引数を有しておらず、引数リストｌが空のリストである場合には処理を終了する。引数リストｌが空のリストでない場合にはステップＳ３２に進む。
【００６１】
ステップＳ３２において、処理エンジン３８は、引数リストｌの１番目の要素（つまり引数）を変数Ｆに代入し、引数リストｌのその余の要素（２〜最後までの要素）を配列変数Ｒに代入する。以下、ステップＳ３４及びＳ３６と、ステップＳ３８とが並列に実行される。
【００６２】
ステップＳ３４において、処理エンジン３８は、Ｆについて関数ｆを実行する。つまり、引数リストｌの１番目の引数について関数ｆを実行する。次いで、ステップＳ３６において、処理エンジン３８は、引数リストｌと同数の要素からなる出力リストに、ステップＳ３４における処理結果を追加する。処理結果は、処理に係る引数の引数リストｌにおける順番に応じた配列位置に追加される。例えば、引数リストｌの１番目の要素についての処理結果は、出力リストの１番目の要素に追加される。
【００６３】
ステップＳ３４及びＳ３６と並行して、ステップＳ３８において、処理エンジン３８は、配列変数Ｒを引数とするｐｍａｐｌｉｓｔ関数であるｐｍａｐｌｉｓｔ（Ｒ，ｆ）を実行する。すなわち、配列変数Ｒについての１番目の要素（ここでは引数リストｌの２番目の要素）について関数ｆを実行して、その処理結果を出力リスト（ここでは出力リストの２番目の要素）に追加し、配列変数Ｒのその余の要素（ここでは引数リストｌの３〜最後までの要素）について、さらにｐｍａｐｌｉｓｔ関数を実行する。
【００６４】
このように、ｐｍａｐｌｉｓｔ関数は、引数のリストの１番目の要素についての関数ｆの実行と、その余の要素のリストを引数とする更なるｐｍａｐｌｉｓｔ関数の実行とを繰り返していく。これにより、複数の引数についての関数の実行が並列に行われる。
【００６５】
次に、図９に示すフローチャートを参照しながら、図７のフローチャートにおけるステップＳ１８の処理、すなわち部分ジョブの送信先の処理ノード１２の決定処理の流れを説明する。
【００６６】
ステップＳ４０において、判定部４０は、ステップＳ１０（図７）で受け付けたジョブに含まれる関数のうち、ステップＳ１６で判定された、処理エンジン３８が実行できない関数を特定する。処理エンジン３８が実行できない関数が複数ある場合は、そのうち１つの関数を特定する。
【００６７】
ステップＳ４２において、判定部４０は、ステップＳ４０で特定した関数をキーとしてノード情報３４を検索し、当該関数を実行可能な処理ノード１２である判定対象処理ノードを特定する。当該関数を実行可能な処理ノード１２が複数ある場合は、判定部４０は、そのうち１つの処理ノード１２を判定対象処理ノードとして特定する。本実施形態では、ノード情報３４における関連付けの順序が高い処理ノード１２を優先的に判定対象処理ノードとして特定する。例えば、ステップＳ４０で面付け処理が特定された場合には、判定部４０は、図５に示すノード情報３４を参照して、まず関連付けの順序が１番目である処理ノード０を判定対象処理ノードとして特定する。
【００６８】
ステップＳ４４において、判定部４０は、ステップＳ４２で特定された判定対象処理ノードの処理負荷が、当該処理ノード１２の処理能力に対する所定量以下であるか否かを判定する。処理負荷が所定量以下である場合にはステップＳ４６に進み、処理負荷が所定量を超える場合にはステップＳ４２に戻る。
【００６９】
再度のステップＳ４２において、判定部４０は、当該関数を実行可能な処理ノード１２である他の処理ノード１２を判定対象処理ノードとして特定する。実施形態では、ノード情報３４における関連付けの順序が次に高い処理ノード１２を判定対象処理ノードとする。例えば、上述の面付け処理の例では、判定部４０は、図５に示すノード情報３４を参照して、関連付けの順序が２番目である処理ノード２を判定対象処理ノードとして特定する。
【００７０】
ステップＳ４６において、部分ジョブ送信処理部４２は、判定対象処理ノードを送信先の処理ノード１２として決定する。
【００７１】
なお、ステップＳ４２及びＳ４４の処理において、当該関数を実行可能な全ての処理ノード１２の処理負荷が各処理ノード１２の所定量を超えている場合は、ノード情報３４において関連付けの順序が１番目である処理ノード１２を送信先の処理ノード１２としてよい。
【００７２】
次に、図１０を参照しながら、部分ジョブを受け取った他の処理ノード１２における部分ジョブ処理の流れを説明する。
【００７３】
ステップＳ５０において、処理ノード１２は、他の処理ノード１２（例えば第１処理ノード１２ａ）から部分ジョブを受け付ける。
【００７４】
ステップＳ５２において、処理エンジン３８は、ステップＳ１０で受け付けたジョブに含まれる関数のうち実行可能な関数を実行し、その処理結果を保持しておく。ここで、当該関数が複数の引数を有している場合には、処理エンジン３８は、図８のフローチャートに示される通りの処理の流れで、各引数についての当該関数の実行を並列に行う。
【００７５】
ステップＳ５４において、判定部４０は、ステップＳ５０で受け付けた部分ジョブに、処理エンジン３８が実行不可能な関数が含まれるか否かを判定する。実行不可能な関数が含まれない場合、すなわち、ステップＳ５０で受け付けた部分ジョブに含まれる全ての関数が処理エンジン３８で実行可能な場合にはステップＳ６０に進む。実行不可能な関数が含まれる場合にはステップＳ５６に進む。
【００７６】
ステップＳ５６において、部分ジョブ送信処理部４２は、図９のフローチャートに示される通りの処理の流れで、ステップＳ５０で受け付けた部分ジョブのうち、ステップＳ５２で実行された関数及びその引数以外の残部分からなる、さらなる部分ジョブの送信先の処理ノード１２を決定する。
【００７７】
ステップＳ５８において、部分ジョブ送信処理部４２は、ステップＳ５６で決定した送信先の処理ノード１２にさらなる部分ジョブを送信する。さらなる部分ジョブを受け付けた送信先の処理ノード１２は、本フローチャートと同様の処理によって当該更なる部分ジョブを処理する。
【００７８】
ステップＳ６０において、処理エンジン３８は、ステップＳ５２における部分ジョブの処理結果を、当該部分ジョブの送信元の処理ノード１２に送信する。なお、さらなる部分ジョブを他の処理ノード１２に送信した場合は、当該他の処理ノード１２から、当該更なる部分ジョブの処理結果を受信することになるが、処理エンジン３８は、他の処理ノード１２から受信した処理結果を送信元の処理ノード１２に転送する。
【００７９】
次に、図１１に示すフローチャートを参照しながら、図７のフローチャートにおけるステップＳ２４の処理、すなわち複数の処理ノード１２における複数の処理結果をまとめる処理の流れを説明する。本実施形態では、複数の処理結果をまとめる処理は、マージ関数で実現される。マージ（ｌ）で示されるマージ関数は、複数の処理結果からなる処理結果リストｌを引数として有する。
【００８０】
ステップＳ７０において、処理エンジン３８は、処理結果リストｌの要素数が１であるか否かを判定する。処理結果リストｌの要素数が１である場合、すなわち、ジョブに含まれる関数が全て第１処理ノード１２ａで実行され、他の処理ノード１２に部分ジョブが送信されなかった場合には、ステップＳ７２に進む。ステップＳ７２において、処理エンジン３８は、処理結果リストｌに含まれる１つの要素をジョブの処理結果として出力する。処理結果リストｌの要素数が１でない場合はステップＳ７４に進む。
【００８１】
ステップＳ７４において、処理エンジン３８は、処理結果リストｌの１番目の要素を変数Ａ１に代入し、処理結果リストｌの２番目の要素を変数Ａ２に代入し、処理結果リストｌのその余の要素（３〜最後までの要素）を配列変数Ｌｒに代入する。以下、ステップＳ７６とＳ７８とが並列に実行される。
【００８２】
ステップＳ７６において、処理エンジン３８は、変数Ａ１と変数Ａ２とを連接する（すなわちまとめる）処理を実行する。つまり、処理結果リストｌの１番目と２番目の処理結果を連接する処理を実行する。処理エンジン３８は、その処理結果を変数Ｒｅｓｆに代入する。
【００８３】
ステップＳ７６と並行して、ステップＳ７８において、処理エンジン３８は、配列変数Ｌｒを引数とするマージ関数であるマージ（Ｌｒ）を実行する。すなわち、配列変数Ｌｒについての１番目の要素（ここでは処理結果リストｌの３番目の要素）と配列変数Ｌｒについての２番目の要素（ここでは処理結果リストｌの４番目の要素）とをまとめる処理を実行して、配列変数Ｌｒのその余の要素（ここでは処理結果リストｌの５〜最後までの要素）について、さらにマージ関数を実行する。処理エンジン３８は、マージ（Ｌｒ）の結果を変数Ｒｅｓｒに代入する。
【００８４】
ステップＳ８０において、処理エンジン３８は、変数Ｒｅｓｆと変数Ｒｅｓｒを連接し、出力する。
【００８５】
このように、マージ関数は、処理結果のリストの１番目と２番目の要素を連接し、その余の処理結果のリストを引数とするマージ関数の実行とを繰り返していく。これにより、複数の処理結果をまとめる処理が並列に実行される。
【００８６】
以上、本実施形態に係る画像処理システム１０においては、各処理ノード１２は、受け取ったジョブあるいは部分ジョブのうち、自処理ノードで実行可能な関数のみを実行した上で、当該ジョブあるいは部分ジョブの残りの部分であってその他の関数及びその引数からなる部分ジョブを他の処理ノード１２に送信するという処理を行っていく。部分ジョブに含まれる関数を処理した処理ノード１２は、当該部分ジョブの送信元の処理ノード１２にその処理結果を送信する。このような処理により、画像処理システム１０においては、ジョブを分割して複数の処理ノード１２に分散送信する中央処理ノードを設ける必要なく、複数の処理ノード１２における分散処理が実現される。
【００８７】
また、本実施形態では、ジョブは、複数の引数をついての関数で表現されていることから、１つの処理ノード１２における１つの関数の処理においても、複数の引数について並列処理を行うことができる。これにより、さらなる処理速度の向上が期待できる。
【００８８】
また、ジョブを動的プログラミング言語で記載することにより、新たな機能（関数）を実行可能な処理ノード１２が画像処理システム１０に追加された場合であっても、ジョブの記載フォーマットの変更などの手続きを行うことなく、動的に当該新関数を用いたジョブを記載することが可能となっている。
【００８９】
以上、本発明に係る実施形態を説明したが、本発明は上記実施形態に限られるものではなく、本発明の趣旨を逸脱しない限りにおいて種々の変更が可能である。
【符号の説明】
【００９０】
１０  画像処理システム、１２  処理ノード、１２ａ  第１処理ノード、１４  ユーザ端末、１６  ネットワーク、１８  画像形成装置、２０  出力装置、３０  通信部、３２  記憶部、３４  ノード情報、３６  制御部、３８  処理エンジン、４０  判定部、４２  部分ジョブ送信処理部、４４  変換部。
【図１】
2020038532.tif 000003
【図２】
2020038532.tif 000004
【図３】
2020038532.tif 000005
【図４】
2020038532.tif 000006
【図５】
2020038532.tif 000007
【図６】
2020038532.tif 000008
【図７】
2020038532.tif 000009
【図８】
2020038532.tif 000010
【図９】
2020038532.tif 000011
【図１０】
2020038532.tif 000012
【図１１】
2020038532.tif 000013