Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

パイプライン実装をchanでなくiterを使えないか #274

Open
ddddddO opened this issue Feb 6, 2024 · 7 comments
Open

パイプライン実装をchanでなくiterを使えないか #274

ddddddO opened this issue Feb 6, 2024 · 7 comments

Comments

@ddddddO
Copy link
Owner

ddddddO commented Feb 6, 2024

ただ、ビルド時かな、環境変数で機能をonにする必要がある
iter実装難しそうだけど、試してみたい
既存のchan使った実装とパフォーマンスの比較もしたい

@ddddddO
Copy link
Owner Author

ddddddO commented Feb 7, 2024

https://github.com/mattn/go-for-range-experiment-example/

こちらも実装の参考にしたい

@ddddddO
Copy link
Owner Author

ddddddO commented Feb 9, 2024

試してみた
https://github.com/ddddddO/work/blob/master/go/cmd/iter/main.go

いけそうにおもう

各ステージのエラーもSeqの型の中に入れれば良さそう?いや?

対応箇所は内部関数なので、iter関数内でerr時にpanic → 呼び出し元でrecoverでerrをハンドリングでいけそう?

@ddddddO
Copy link
Owner Author

ddddddO commented Feb 10, 2024

エラーハンドリング可能なパイプラインのサンプル実装
https://github.com/ddddddO/work/blob/2a9b38da3bdab3f1bf3691b9a5532834f7e9b462/go/cmd/iter/main.go#L245-L264

これでやりたいことができそう
あとは時間あるときとにやる

@ddddddO
Copy link
Owner Author

ddddddO commented Feb 10, 2024

迷う
サンプル実装したけどシュッとできそう感もある、どうしよう

今あまり手を出さないほうがいいかも。本格的にgo本体に導入決まってからのほうが手戻りなさそう

@ddddddO
Copy link
Owner Author

ddddddO commented Feb 10, 2024

@ddddddO
Copy link
Owner Author

ddddddO commented Feb 11, 2024

gtree/pipeline_tree.go

Lines 78 to 82 in c1c007f

splitStream, errcsl := split(ctx, r)
rootStream, errcr := newRootGeneratorPipeline().generate(ctx, splitStream)
growStream, errcg := t.grower.grow(ctx, rootStream)
errcs := t.spreader.spread(ctx, w, growStream)
return t.handlePipelineErr(ctx, errcsl, errcr, errcg, errcs)

でいちいち変数にとって渡す、みたいにしなくてよくなって1行で書けそうだし、chanでないから、入力値の順番で処理が保証されるから、やりたい度は高い

↓な感じになる、きれい

for err := range spread(grow(generate(split(ctx, r)))) {
    if err != nil {
        return err    
    }
}
return nil

@ddddddO
Copy link
Owner Author

ddddddO commented Feb 17, 2024

パイプライン実装以外でもiter実装できそう
ref:

func (rg *rootGeneratorSimple) generate() ([]*Node, error) {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant