Þîþéļîñé
Ţĥé þîþéļîñé îš ĥöŵ ñéöķàþî ŕüñš à ƒļöŵ. À ƒļöŵ ñàḿéš ţĥé ţööļš àñđ ţĥéîŕ öŕđéŕ. Ţĥé þîþéļîñé ŕüñš ţĥéḿ çöñçüŕŕéñţļý: à ƒöŕḿàţ ŕéàđéŕ, à çĥàîñ öƒ ţööļš, àñđ à ƒöŕḿàţ ŵŕîţéŕ, éàçĥ îñ îţš öŵñ ĝöŕöüţîñé àñđ çöññéçţéđ ƃý ƃüƒƒéŕéđ çĥàññéļš öƒ Þàŕţš.
Ţĥé éẋéçüţöŕ îš ƃüîļţ öñ Ĝö'š ñàţîṽé çöñçüŕŕéñçý: ĝöŕöüţîñéš ƒöŕ ţĥé šţàĝéš,
çĥàññéļš ƒöŕ ţĥé çöññéçţîöñš, àñđ errgroup ƒöŕ çööŕđîñàţîöñ.
Ţĥé ŕéàđéŕ àñđ ŵŕîţéŕ šĥöŵñ ĥéŕé àŕé ţĥé ƒîļé ƃîñđîñĝ, ţĥé đéƒàüļţ ŵàý
çöñţéñţ éñţéŕš àñđ ļéàṽéš ţĥé þîþéļîñé. Ţĥé šàḿé ţööļ šţŕéàḿ çàñ îñšţéàđ ƃé ƃöüñđ
ţö à þŕöĵéçţ šţöŕé, à .kpz ŵöŕķšþàçé, öŕ àñ îñţéŕçĥàñĝé ƒîļé, ŵîţĥ ñö ŕéàđéŕ öŕ
ŵŕîţéŕ (ƒļöŵš: šöüŕçé àñđ šîñķ).
:::ţîþ Ŵàţçĥ îţ ŕüñ, šţéþ ƃý šţéþ
Ŕüñ à ƒîļé ţĥŕöüĝĥ à þîþéļîñé àñđ đŕîṽé îţ ŵîţĥ Ñéẋţ. Éàçĥ šţéþ àđṽàñçéš ţĥé
šţŕéàḿ ƃý öñé éṽéñţ, šö ýöü çàñ ŵàţçĥ Þàŕţš ḿöṽé öüţ öƒ ţĥé ŕéàđéŕ, ţĥŕöüĝĥ ţĥé
ţööļš, àñđ îñţö ţĥé ŵŕîţéŕ, îñšþéçţîñĝ ĥöŵ éàçĥ Þàŕţ çĥàñĝéš àţ éṽéŕý šţàĝé. Ţĥîš
ŕüñš ţĥé ŕéàļ kapi éñĝîñé îñ ýöüŕ ƃŕöŵšéŕ ṽîà ŴéƃÀššéḿƃļý.
:::
Šţŕéàḿîñĝ, ñöţ ƃàţçĥîñĝ
Ţĥé ŕéàđéŕ éḿîţš Þàŕţš àš îţ þàŕšéš, àñđ ţĥöšé Þàŕţš ƒļöŵ đöŵñšţŕéàḿ ŵĥîļé ţĥé ŕéàđéŕ îš šţîļļ ŵöŕķîñĝ. Éàçĥ ţööļ þŕöçéššéš à Þàŕţ àš šööñ àš îţ àŕŕîṽéš àñđ ƒöŕŵàŕđš îţ, šö ţĥé ŵŕîţéŕ çàñ ƃéĝîñ éḿîţţîñĝ öüţþüţ ƃéƒöŕé ţĥé ŕéàđéŕ ĥàš ƒîñîšĥéđ ŕéàđîñĝ. Ḿéḿöŕý üšé šţàýš ƃöüñđéđ ƃý ţĥé šîžé öƒ ţĥé çĥàññéļ ƃüƒƒéŕš àñđ ţĥé Þàŕţš îñ ƒļîĝĥţ, ñöţ ƃý ţĥé šîžé öƒ ţĥé đöçüḿéñţ.
Ţĥé çöñţéñţ ḿöđéļ ƒöļļöŵš ƒŕöḿ ţĥîš: à Part îš ţĥé
îñđîṽîšîƃļé üñîţ ţĥàţ ƒļöŵš ţĥŕöüĝĥ, àñđ à đöçüḿéñţ îš à šţŕéàḿ öƒ Þàŕţš (ļàýéŕ
šţàŕţš, ƃļöçķš, đàţà, ļàýéŕ éñđš).
Çĥàññéļš àñđ ƃàçķþŕéššüŕé
Àđĵàçéñţ šţàĝéš àŕé çöññéçţéđ ƃý ƃüƒƒéŕéđ çĥàññéļš, ƃý đéƒàüļţ à ƃüƒƒéŕ öƒ 64 Þàŕţš. Ţĥé ƃüƒƒéŕ đéçöüþļéš ţĥé šţàĝéš šö à ƒàšţ ŕéàđéŕ đöéš ñöţ ĥàṽé ţö ŵàîţ öñ à šļöŵ ţööļ ƒöŕ éṽéŕý šîñĝļé Þàŕţ, ƃüţ îţ îš ƃöüñđéđ: ŵĥéñ ţĥé ƃüƒƒéŕ ƒîļļš, ţĥé üþšţŕéàḿ šţàĝé ƃļöçķš öñ îţš šéñđ üñţîļ ţĥé đöŵñšţŕéàḿ šţàĝé çàţçĥéš üþ. Ţĥàţ ƃļöçķîñĝ îš ţĥé ƃàçķþŕéššüŕé. À šļöŵ ţööļ, šüçĥ àš àñ ÀÎ ţŕàñšļàţîöñ šţéþ ŵàîţîñĝ öñ à ñéţŵöŕķ çàļļ, ţĥŕöţţļéš ţĥé ŕéàđéŕ ţĥàţ ƒééđš îţ, ŵîţĥ ñö éẋþļîçîţ ŕàţé ļîḿîţîñĝ öŕ ǫüéüé ḿàñàĝéḿéñţ.
Éàçĥ ţööļ ŕüñš Process(ctx, in, out) îñ îţš öŵñ ĝöŕöüţîñé. Ţĥé éẋéçüţöŕ ŵîŕéš
šţàĝé i'š öüţþüţ çĥàññéļ ţö šţàĝé i+1'š îñþüţ çĥàññéļ, ļàüñçĥéš à ĝöŕöüţîñé
þéŕ ţööļ, àñđ çļöšéš éàçĥ öüţþüţ çĥàññéļ ŵĥéñ îţš ţööļ ŕéţüŕñš. Çĥàññéļ çļöšé îš
ţĥé éñđ-öƒ-šţŕéàḿ šîĝñàļ: à ţööļ'š Process ļööþ éẋîţš ŵĥéñ îţš îñþüţ çĥàññéļ îš
çļöšéđ àñđ đŕàîñéđ, ţĥéñ çļöšéš îţš öŵñ öüţþüţ, ŵĥîçĥ šîĝñàļš ţĥé ñéẋţ ţööļ, àñđ
šö öñ đöŵñ ţö ţĥé ŵŕîţéŕ.
Éŕŕöŕ ĥàñđļîñĝ àñđ çàñçéļļàţîöñ
Ţĥé šţàĝéš àŕé çööŕđîñàţéđ ƃý àñ errgroup.Group. ΃ àñý ţööļ'š Process
ŕéţüŕñš àñ éŕŕöŕ, ţĥé ĝŕöüþ çàñçéļš à šĥàŕéđ çöñţéẋţ đéŕîṽéđ ƒŕöḿ ţĥé çàļļéŕ'š
çöñţéẋţ. Éṽéŕý šţàĝé šéļéçţš öñ ctx.Done() îñ îţš çĥàññéļ öþéŕàţîöñš, šö
çàñçéļļàţîöñ þŕöþàĝàţéš þŕöḿþţļý ţö àļļ ĝöŕöüţîñéš: à šţàĝé ƃļöçķéđ öñ à šéñđ öŕ
à ŕéçéîṽé ŵàķéš üþ àñđ ŕéţüŕñš. Öñ à þàŕţîàļ ƒàîļüŕé ţĥé þîþéļîñé ţéàŕš đöŵñ
ŵîţĥ ñö ļéàķéđ ĝöŕöüţîñéš, àñđ ţĥé çàļļéŕ ŕéçéîṽéš ţĥé ƒîŕšţ éŕŕöŕ.
Ƃéçàüšé çàñçéļļàţîöñ ƒļöŵš ƒŕöḿ ţĥé çàļļéŕ'š çöñţéẋţ, à þîþéļîñé îš àļšö çàñçéļļàƃļé ƒŕöḿ ţĥé öüţšîđé. Çļöšîñĝ à ÇĻÎ ŕüñ, à ŕéǫüéšţ ţîḿéöüţ, àñđ à đéšķţöþ "šţöþ" ƃüţţöñ àļļ çàñçéļ ţĥé šàḿé çöñţéẋţ àñđ üñŵîñđ éṽéŕý šţàĝé.
Ļàýéŕš öƒ çöñçüŕŕéñçý
Ţĥé ţööļ çĥàîñ îš öñé öƒ ţĥŕéé îñđéþéñđéñţ çöñçüŕŕéñçý ļàýéŕš:
| Ļàýéŕ | Ŵĥàţ ŕüñš çöñçüŕŕéñţļý |
|---|---|
| Šţàĝé (ţööļ) þîþéļîñé | Éàçĥ ţööļ îñ ţĥé çĥàîñ ŕüñš îñ îţš öŵñ ĝöŕöüţîñé, ţĥé đéƒàüļţ. |
| Îñţŕà-ţööļ ƃļöçķš | À ƃļöçķ-ĥàñđļîñĝ ţööļ çàñ ƒàñ îţš ŵöŕķ àçŕöšš Ñ ĝöŕöüţîñéš ŵĥîļé þŕéšéŕṽîñĝ Þàŕţ öŕđéŕ (šéé Ţööļš). |
| Ƃàţçĥ đöçüḿéñţš | Ţĥé éẋéçüţöŕ þŕöçéššéš ḿàñý îñþüţ ƒîļéš îñ þàŕàļļéļ, ƃöüñđéđ ƃý à çöñçüŕŕéñçý ļîḿîţ. |
Đöçüḿéñţ-ļéṽéļ ƃàţçĥîñĝ îš çöñţŕöļļéđ öñ ţĥé éẋéçüţöŕ. MaxConcurrency ƃöüñđš
ĥöŵ ḿàñý đöçüḿéñţš ŕüñ àţ öñçé (1 îš šéǫüéñţîàļ, 0 ḿéàñš üšé ţĥé ñüḿƃéŕ öƒ
ÇÞÜš) àñđ à šéḿàþĥöŕé éñƒöŕçéš ţĥé ƃöüñđ. Ŵîţĥ ƒàîļ-ƒàšţ éñàƃļéđ (ţĥé đéƒàüļţ),
ţĥé ƒîŕšţ đöçüḿéñţ éŕŕöŕ çàñçéļš ţĥé ŕéḿàîñîñĝ ŵöŕķ; ŵîţĥ îţ đîšàƃļéđ, ţĥé
éẋéçüţöŕ ŕüñš éṽéŕý đöçüḿéñţ àñđ ŕéþöŕţš éŕŕöŕš ţöĝéţĥéŕ. Éàçĥ đöçüḿéñţ ĝéţš îţš
öŵñ ţööļ çĥàîñ (ṽîà ţĥé ƒļöŵ'š ţööļ ƒàçţöŕîéš) šö çöñçüŕŕéñţ
đöçüḿéñţš ñéṽéŕ šĥàŕé ţööļ šţàţé.
Çöñƒîĝüŕîñĝ ţĥé éẋéçüţöŕ
Ţĥé éẋéçüţöŕ îš çŕéàţéđ ŵîţĥ ƒüñçţîöñàļ öþţîöñš:
executor := flow.NewExecutor(
flow.WithMaxConcurrency(4), // documents in parallel; 0 = NumCPU, 1 = sequential
flow.WithChannelSize(64), // inter-tool channel buffer
flow.WithFailFast(true), // cancel remaining documents on first error
)
err := executor.Execute(ctx, f, items)
Ŵîţĥ ñö öþţîöñš îţ ŕüñš šéǫüéñţîàļļý, ŵîţĥ à çĥàññéļ ƃüƒƒéŕ öƒ 64 àñđ ƒàîļ-ƒàšţ
öñ. Execute ţàķéš à ƃüîļţ ƒļöŵ àñđ à šļîçé öƒ îţéḿš (éàçĥ àñ îñþüţ đöçüḿéñţ, àñ
öüţþüţ þàţĥ, àñđ à ţàŕĝéţ ļöçàļé) àñđ ŕüñš ţĥé ŵĥöļé ƃàţçĥ.
À çàļļéŕ ţĥàţ ƒééđš Þàŕţš îñ àñđ ŕéàđš ŕéšüļţš öüţ đîŕéçţļý, ŵîţĥ ñö ƒîļéš, çàñ àšķ ţĥé éẋéçüţöŕ ƒöŕ ţĥé çĥàîñ'š îñþüţ àñđ öüţþüţ çĥàññéļš. Ţĥé éẋéçüţöŕ ŵîŕéš ţĥé šàḿé ĝöŕöüţîñé-þéŕ-ţööļ þîþéļîñé àñđ ļéàṽéš ţĥé éñđš öþéñ ƒöŕ ţĥé çàļļéŕ.
Öƃšéŕṽàţîöñ
Ƃéçàüšé ţĥé þîþéļîñé îš à šţŕéàḿ öƒ Þàŕţš, ŵöŕķ çàñ ƃé öƃšéŕṽéđ ŵîţĥöüţ đîšţüŕƃîñĝ îţ. Ţĥé éẋéçüţöŕ àççéþţš çöļļéçţöŕš ţĥàţ àŕé ƒéđ ţĥé öüţþüţ Þàŕţš öƒ éàçĥ đöçüḿéñţ àš îţ çöḿþļéţéš. Çŕöšš-đöçüḿéñţ àñàļýšîš (šçöþîñĝ ŕéþöŕţš, ŕéþéţîţîöñ àñàļýšîš àçŕöšš à ƃàţçĥ) àççüḿüļàţéš îţš ŕéšüļţš ţĥîš ŵàý. À çöļļéçţöŕ ŕéàđš ţĥé ƒîñîšĥéđ šţŕéàḿ ƒŕöḿ öüţšîđé ţĥé ţööļ çĥàîñ.
Ŕéļàţéđ ŕéàđîñĝ
- Ƒļöŵš: ţĥé ĝŕàþĥ ţĥé þîþéļîñé éẋéçüţéš.
- Ţööļš: ţĥé šţàĝéš ţĥàţ ŕüñ îñ ţĥé þîþéļîñé.
- Çöñţéñţ Ḿöđéļ: ţĥé Þàŕţ ţĥàţ šţŕéàḿš ţĥŕöüĝĥ îţ.
- É-01: Þŕöçéššîñĝ Éñĝîñé: ţĥé đéšîĝñ ŕàţîöñàļé.