子プロセスのプロセスID表示に関して

コメント

6件のコメント

  • 正式なコメント
    服部健太

    子プロセスは、ジョブフロープロセスが fork や pfor を使った場合に生成されます。したがって、ご認識の通り、これらを使用しない限り子プロセス一覧には何も表示されません。

    ジョブフローの呼び出した際、呼び出し先のジョブフローの処理は、現在実行中のプロセスのコンテクストで処理されます(子プロセスは作成されません)。

     

    コメントアクション Permalink
  • aoki

    ご回答いただきありがとうございます。

    子プロセスは、ジョブフロープロセスが fork や pfor を使った場合に生成されること、承知いたしました。

     

    実際に行いたいことは、メインジョブからサブジョブを呼び出す際に、サブジョブの全てに関してのプロセスIDを取得することです。そのためにサブジョブをforkブロック内に配置し、子プロセスとすることでプロセスIDを取得したいと考えています。

    各サブジョブのプロセスIDを取得したいと考えた場合には、fork や pfor を使用する方法しかありませんでしょうか?

     

    forkブロック内のジョブは並行して処理されるとのことですが、例えば画像内の処理Bの結果を処理Cに渡すことはできますでしょうか?

    処理Bから処理Cに結果の値を渡したい場合、forkブロックをそれぞれ分ける必要がありますでしょうか?

    ご教示いただけますと幸いです。

    よろしくお願いいたします。

    0
    コメントアクション Permalink
  • 服部健太

    自分自身のプロセスIDについては、current() 組み込み関数を呼び出すことで取得可能です。この関数は、自プロセスオブジェクトを返します。したがいまして、サブプロセス内でプロセスIDを取得したい場合は、current()を呼び出してください。

    また、fork で生成した子プロセス間で結果を受け渡す場合、チャネルを利用することが可能です。channel()組み込み関数で、オンメモリ上に一時的なチャネルオブジェクトを作成し、チャネル経由で複数プロセス間で値の送受信が可能です。処理Bから処理Cに結果を渡したい場合は、例えば、以下のようになります。

    ...
    [chan = channel()] -> # プロセス間通信用のチャネルを作成
    { fork |
    [./処理B] -> [chan.send: $RESULT] -> print('処理B終了')
    <chan> -> [result_B = $RESULT] -> [./処理C: result_B] -> print('処理C終了')
    }
    -> ...

    ただ、この場合、処理B実行結果を待って処理Cが実行されますので、逐次的な処理となり、forkを使う意味はあまり無いかと思います。

    fork を用いずに普通に

    ...
    [./処理B] ->
    [./処理C: $RESULT] ->
    ...

    と書いた方がシンプルでトラブルも少ないかと思います。

    0
    コメントアクション Permalink
  • aoki

    詳細にご回答いただきありがとうございます。大変助かります。

    以下のように解釈をしたのですが、間違いないでしょうか。

     

    • fork を使った際に、子プロセスのプロセスIDを取得したい場合にはcurrent() を使うと子プロセスのプロセスIDを取得できる。
    • fork 内の子プロセス間で結果を受け渡す場合、チャネルを利用することが可能ですが、逐次的な処理となる。結果を受け渡す処理だけ行いたいのであればfork を使わない方がシンプルになる。
    • 同一fork ブロック内で全ての子プロセスIDを取得することに加え、子プロセス間での値の受け渡しもしたい場合には、current() とchannel() を使用する。
    • fork を使用せずにメインジョブ内でサブジョブを呼び出した際、どのサブジョブでcurrent() を使用してもメインジョブのプロセスIDのみが取得される。

     

    度々の質問で恐縮ですが、よろしくお願いいたします。

     

    0
    コメントアクション Permalink
  • 服部健太

    ・fork を使った際に、子プロセスのプロセスIDを取得したい場合にはcurrent() を使うと子プロセスのプロセスIDを取得できる。

    current()は子プロセスではなく、自身のプロセスオブジェクトを取得します。fork()された子プロセスの中でcurrent() を呼び出すことで、結果として子プロセスの情報を取得することが可能になります。

    ・fork 内の子プロセス間で結果を受け渡す場合、チャネルを利用することが可能ですが、逐次的な処理となる。結果を受け渡す処理だけ行いたいのであればfork を使わない方がシンプルになる。

    はい。結果を待ってから処理を行うので、複数のプロセスが作られるものの、結局は逐次的に処理されることになります。

    ・同一fork ブロック内で全ての子プロセスIDを取得することに加え、子プロセス間での値の受け渡しもしたい場合には、current() とchannel() を使用する。

    複数の子プロセス間でチャネルが共有されている場合、そのチャネルを通じて値の受け渡しが可能ですので、current()は必要ありません。

    ・fork を使用せずにメインジョブ内でサブジョブを呼び出した際、どのサブジョブでcurrent() を使用してもメインジョブのプロセスIDのみが取得される。

    はい。サブジョブの実行は呼び出し側と同じプロセス上で処理されるため、結果としてそうなります。

    0
    コメントアクション Permalink
  • aoki

    ご回答ありがとうございました。

    fork と current () を使用して実行したい処理を行うことができそうです。

    この度はご対応いただきましてありがとうございました。

    今後ともよろしくお願いいたします。

    0
    コメントアクション Permalink

サインインしてコメントを残してください。