Þîþéļîñé
Ţĥé þîþéļîñé îš ĥöŵ neokapi ŕüñš à ƒļöŵ. Ŵĥéŕé à ƒļöŵ šàýš ŵĥàţ ţööļš ţö ŕüñ îñ ŵĥàţ öŕđéŕ, ţĥé þîþéļîñé îš ţĥé çöñçüŕŕéñţ ḿàçĥîñéŕý ţĥàţ àçţüàļļý ŕüñš ţĥéḿ: à ƒöŕḿàţ ŕéàđéŕ, à çĥàîñ öƒ ţööļš, àñđ à ƒöŕḿàţ ŵŕîţéŕ, éàçĥ ŕüññîñĝ îñ îţš öŵñ ĝöŕöüţîñé àñđ çöññéçţéđ ƃý ƃüƒƒéŕéđ çĥàññéļš öƒ Þàŕţš.
Ţĥé éẋéçüţöŕ îš ƃüîļţ öñ Ĝö'š ñàţîṽé çöñçüŕŕéñçý: ĝöŕöüţîñéš ƒöŕ ţĥé šţàĝéš,
çĥàññéļš ƒöŕ ţĥé çöññéçţîöñš, àñđ 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: Þŕöçéššîñĝ Éñĝîñé: ţĥé đéšîĝñ ŕàţîöñàļé.