Rust: async/await์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ(RFC 2394)

์— ๋งŒ๋“  2018๋…„ 05์›” 08์ผ  ยท  308์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ด๊ฒƒ์€ ์–ธ์–ด์— async ๋ฐ await ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” RFC 2394(rust-lang/rfcs#2394)์˜ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ด RFC์˜ ๊ตฌํ˜„ ์ž‘์—…์„ ์ฃผ๋„ํ•  ๊ฒƒ์ด์ง€๋งŒ Rustc์—์„œ ์ž‘์—…ํ•œ ๊ฒฝํ—˜์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ˜ํ† ๋ง์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ:

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ:

A-async-await A-generators AsyncAwait-Triaged B-RFC-approved C-tracking-issue T-lang

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ตฌ๋ฌธ ์ •๋ณด: await ๋ฅผ ๋‹จ์ˆœ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธ”๋กœ๊ทธ์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” await ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ๊ตฌ๋ฌธ์ด ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ์ด ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜์ธ ๊ฒฝ์šฐ - ๋ชจ๋“  IO ๋ฏธ๋ž˜๊ฐ€ ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ - ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ? ์—ฐ์‚ฐ์ž๋ฅผ ๊ทธ๊ฒƒ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์šฐ์„  ์ˆœ์œ„๋Š” ๋†€๋ผ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ? ๊ฐ€ await๋ณด๋‹ค ์–ดํœ˜์ ์œผ๋กœ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  await io_future? ๋Š” ์ฒซ ๋ฒˆ์งธ๋กœ await ์ด๊ณ  ? ๋‘ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์— ๋™์˜ํ•˜์ง€๋งŒ ์ค‘๊ด„ํ˜ธ๋Š” ๋‚˜์˜๋‹ค. ? ๊ฐ€ await ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋๋‚ด๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

let foo = await future?

์ฝ๊ธฐ๊ฐ€ ๋” ์‰ฝ๊ณ  ๋ฆฌํŒฉํ† ๋ง์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

let foo = await!(future)?

์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

await foo? await ๋จผ์ € ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์–ดํœ˜์ ์œผ๋กœ ๋” ๋ฌถ์—ฌ ์žˆ์ง€๋งŒ await ๋Š” ์™ผ์ชฝ์— ์žˆ๊ณ  ? ๋Š” ์˜ค๋ฅธ์ชฝ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ await ๋จผ์ € Result ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๋’ค์—


์˜๊ฒฌ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํ‘œํ˜„ํ•˜์—ฌ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์กฐ์šฉํ•œ downvote๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๋Ÿฌ์ŠคํŠธ์—๊ฒŒ ํ–‰์šด์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋“  308 ๋Œ“๊ธ€

์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๊ฐ€ ๋๋‚œ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— await ๊ตฌ๋ฌธ ์งˆ๋ฌธ์˜ ์ผ๋ถ€๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. https://internals.rust-lang.org/t/explicit-future-construction-implicit-await/ 7344

๊ตฌํ˜„์ด #50307์—์„œ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ์ •๋ณด: await ๋ฅผ ๋‹จ์ˆœ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธ”๋กœ๊ทธ์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” await ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ๊ตฌ๋ฌธ์ด ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ์ด ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜์ธ ๊ฒฝ์šฐ - ๋ชจ๋“  IO ๋ฏธ๋ž˜๊ฐ€ ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ - ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ? ์—ฐ์‚ฐ์ž๋ฅผ ๊ทธ๊ฒƒ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์šฐ์„  ์ˆœ์œ„๋Š” ๋†€๋ผ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ? ๊ฐ€ await๋ณด๋‹ค ์–ดํœ˜์ ์œผ๋กœ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  await io_future? ๋Š” ์ฒซ ๋ฒˆ์งธ๋กœ await ์ด๊ณ  ? ๋‘ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์— ๋™์˜ํ•˜์ง€๋งŒ ์ค‘๊ด„ํ˜ธ๋Š” ๋‚˜์˜๋‹ค. ? ๊ฐ€ await ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋๋‚ด๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

let foo = await future?

์ฝ๊ธฐ๊ฐ€ ๋” ์‰ฝ๊ณ  ๋ฆฌํŒฉํ† ๋ง์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

let foo = await!(future)?

์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

await foo? await ๋จผ์ € ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์–ดํœ˜์ ์œผ๋กœ ๋” ๋ฌถ์—ฌ ์žˆ์ง€๋งŒ await ๋Š” ์™ผ์ชฝ์— ์žˆ๊ณ  ? ๋Š” ์˜ค๋ฅธ์ชฝ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ await ๋จผ์ € Result ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๋’ค์—


์˜๊ฒฌ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํ‘œํ˜„ํ•˜์—ฌ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์กฐ์šฉํ•œ downvote๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๋Ÿฌ์ŠคํŠธ์—๊ฒŒ ํ–‰์šด์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

await ๊ฐ€ @Pzixel์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ํ˜ผํ•ฉ๋œ ๊ฒฌํ•ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋ฏธํ•™์  ๋งค๋ ฅ์ด ์žˆ๊ณ  ๋” ์ผ๊ด€์„ฑ์ด ์žˆ์ง€๋งŒ async ๊ฐ€ ํ‚ค์›Œ๋“œ๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋ชจ๋“  ์–ธ์–ด์—์„œ "ํ‚ค์›Œ๋“œ ํŒฝ์ฐฝ"์€ ์‹ค์ œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ฆ‰, async ์—†์ด await ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ์ชฝ์œผ๋กœ ๊ธฐ์šธ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

? ๊ฐ€ await ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ  ๊ทธ๊ฒƒ์œผ๋กœ ๋๋‚ด๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฑธ ๋ฐฐ์›Œ์„œ ๋‚ด๋ฉดํ™”ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋งŒ์ง€๋Š” ๊ฒƒ๋“ค์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๊ฒƒ๋ณด๋‹ค ๋” ์ด˜์ด˜ํ•˜๊ฒŒ ๋ฌถ์ธ๋‹ค๋Š” ๊ฐ•ํ•œ ์ง๊ด€๋ ฅ์ด ์žˆ์–ด์„œ ์‹ค์ „์—์„œ๋Š” ํ•ญ์ƒ ์–ธ๋œป ํ‹€๋ฆฌ๊ฒŒ ์ฝํž ๊ฒƒ ๊ฐ™์•„์š”.

๋˜ํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋„์›€์ด ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Result<impl Future, _> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let foo = await (foo()?)?;

์—ฌ๊ธฐ์„œ ๊ด€์‹ฌ์€ ๋‹จ์ˆœํžˆ "๋‹จ์ผ await+ ? ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"๋ฟ๋งŒ ์•„๋‹ˆ๋ผ "์—ฌ๋Ÿฌ await๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€"์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์„ ํƒํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ await (await (await first()?).second()?).third()? ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

await ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์˜ต์…˜ ์š”์•ฝ, ์ผ๋ถ€ ๋Š” RFC ์—์„œ, ๋‚˜๋จธ์ง€๋Š” RFC ์Šค๋ ˆ๋“œ์—์„œ:

  • ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: await { future }? ๋˜๋Š” await(future)? (์ด๊ฒƒ์€ ์‹œ๋„๋Ÿฝ์Šต๋‹ˆ๋‹ค).
  • await future? ๋˜๋Š” (await future)? ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก ์šฐ์„  ์ˆœ์œ„๋ฅผ ์„ ํƒํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(๋‘˜ ๋‹ค ๋†€๋ž์Šต๋‹ˆ๋‹ค).
  • ๋‘ ์—ฐ์‚ฐ์ž๋ฅผ await? future ์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ๋“œ๋ฌธ ์ผ์ž…๋‹ˆ๋‹ค).
  • future await? ๋˜๋Š” future.await? ์™€ ๊ฐ™์ด ์–ด๋–ป๊ฒŒ๋“  await ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ์ „๋ก€๊ฐ€ ์—†๋Š” ์ผ์ž…๋‹ˆ๋‹ค).
  • future@? ์—์„œ์™€ ๊ฐ™์ด ? ์™€ ๊ฐ™์€ ์ƒˆ ์ธ์žฅ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(์ด๊ฒƒ์€ "๋ผ์ธ ๋…ธ์ด์ฆˆ"์ž…๋‹ˆ๋‹ค).
  • ๊ตฌ๋ฌธ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  await๋ฅผ ์•”์‹œ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค(์ด๋Š” ์ผ์‹œ ์ค‘๋‹จ ์ง€์ ์„ ๋” ๋ณด๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค). ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ฏธ๋ž˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ–‰์œ„๋„ ๋ช…์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ„์—์„œ ๋งํฌํ•œ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ์˜ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

์ฆ‰ ๊ฐ€์ง„ ์•Š์Šต๋‹ˆ๋‹ค ๋งํ–ˆ๋‹ค async ํ•˜์ง€ ์•Š๊ณ  await ๋„ ์ง€ํ˜œ, ๊ธฐ๋Šฅ์„ ์ดํ•ด๊ฐ€?

@alexreg ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด Kotlin์€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "์•”์‹œ์  ๋Œ€๊ธฐ" ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

@rpjohnst ํฅ๋ฏธ async ๋ฐ await ๋ฅผ ์–ธ์–ด์˜ ๋ช…์‹œ์  ๊ธฐ๋Šฅ์œผ๋กœ ๋‚จ๊ฒจ๋‘๋Š” ๊ฒƒ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์ด Rust์˜ ์ •์‹ ์— ๋” ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ..

@alexreg async/await๋Š” C#(๋‚ด ๊ธฐ๋ณธ ์–ธ์–ด)์—์„œ ์ผ์ƒ์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ์ข‹์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. @rpjohnst ๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ๋งค์šฐ ์ž˜ ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์„ ์„ ํ˜ธํ•˜๋ฉฐ ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ(์‹œ๋„๋Ÿฌ์šด/๋น„์ •์ƒ์ /...)์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๋‚œ 5๋…„ ๋™์•ˆ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ์ฝ”๋“œ๋กœ ์ž‘์—…ํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@rpjohnst

๋”ฐ๋ผ์„œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์„ ํƒํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ await (await (await first()?).second()?).third()? ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์—ฐ์Šต์—์„œ๋Š” ํ•œ ์ค„์— ๋‘ ๊ฐœ์˜ await ๋ฅผ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋“œ๋ฌผ๊ฒŒ ํ•„์š”ํ•  ๋•Œ then ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  await๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ฝ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์Šค์Šค๋กœ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let first = await first()?;
let second = await first.second()?;
let third = await second.third()?;

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ์‚ฌ๋ก€๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์–ธ์–ด๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํžˆ์–ด๋กœ ์–ด์›จ์ด future await? ๋‚ฏ์„ค์ง€๋งŒ ํฅ๋ฏธ๋กญ๊ฒŒ ๋ณด์ด์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ์  ๋ฐ˜๋ก ์€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์—ฐ์Šต์—์„œ๋Š” ํ•œ ์ค„์— ๋‘ ๊ฐœ์˜ await ๋ฅผ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ตฌ๋ฌธ์— ๊ด€๊ณ„์—†์ด ๋‚˜์œ ์ƒ๊ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด C#์˜ ๊ธฐ์กด await ๊ตฌ๋ฌธ์ด ๋ณด๊ธฐ ํ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์€ try!() ( ? ์˜ ์ „์‹ )์— ๋Œ€ํ•ด ๋น„์Šทํ•œ ์ฃผ์žฅ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋ฐ ์•”์‹œ์  ๋ฒ„์ „์€ ํ›จ์”ฌ ๋œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

first().await?.second().await?.third().await?
first()?.second()?.third()?

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ตฌ๋ฌธ์— ๊ด€๊ณ„์—†์ด ๋‚˜์œ ์ƒ๊ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด C#์˜ ๊ธฐ์กด await ๊ตฌ๋ฌธ์ด ๋ณด๊ธฐ ํ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ?

async ์—ฐ์‚ฐ๋‹น ํ•œ ์ค„์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ดํ•ดํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ์— ๊ด€๊ณ„์—†์ด ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์œผ๋กœ ๋ฌถ๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋‚˜์œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(์ €๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ํ•œ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค).

[Fact]
public async Task Should_UpdateTrackableStatus()
{
    var web3 = TestHelper.GetWeb3();
    var factory = await SeasonFactory.DeployAsync(web3);
    var season = await factory.CreateSeasonAsync(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(1));
    var request = await season.GetOrCreateRequestAsync("123");

    var trackableStatus = new StatusUpdate(DateTimeOffset.UtcNow, Request.TrackableStatuses.First(), "Trackable status");
    var nonTrackableStatus = new StatusUpdate(DateTimeOffset.UtcNow, 0, "Nontrackable status");

    await request.UpdateStatusAsync(trackableStatus);
    await request.UpdateStatusAsync(nonTrackableStatus);

    var statuses = await request.GetStatusesAsync();

    Assert.Single(statuses);
    Assert.Equal(trackableStatus, statuses.Single());
}

์‹ค์ œ๋กœ๋Š” ๊ตฌ๋ฌธ์ด ํ—ˆ์šฉํ•˜๋”๋ผ๋„ await ๋ฅผ ์—ฐ๊ฒฐํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. await ๋Š” ์™„์ „ํžˆ ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚˜์œ ์œ ์ผํ•œ ์ด์œ ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋ฐ ์•”์‹œ์  ๋ฒ„์ „์€ ํ›จ์”ฌ ๋œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์‹œ์ž‘๊ณผ ์ž‘์—… ๋Œ€๊ธฐ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฐ€๋Šฅ์„ฑ์€ ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚˜๋Š” ์ข…์ข… ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค(๋‹ค์‹œ, ํ”„๋กœ์ ํŠธ์˜ ์Šค๋‹ˆํŽซ).

public async Task<StatusUpdate[]> GetStatusesAsync()
{
    int statusUpdatesCount = await Contract.GetFunction("getStatusUpdatesCount").CallAsync<int>();
    var getStatusUpdate = Contract.GetFunction("getStatusUpdate");
    var tasks = Enumerable.Range(0, statusUpdatesCount).Select(async i =>
    {
        var statusUpdate = await getStatusUpdate.CallDeserializingToObjectAsync<StatusUpdateStruct>(i);
        return new StatusUpdate(XDateTime.UtcOffsetFromTicks(statusUpdate.UpdateDate), statusUpdate.StatusCode, statusUpdate.Note);
    });

    return await Task.WhenAll(tasks);
}

์—ฌ๊ธฐ์—์„œ N๊ฐœ์˜ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ ๋ฃจํ”„ ๋ฐ˜๋ณต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์ง€๋งŒ ๋จผ์ € ๋น„๋™๊ธฐ ์š”์ฒญ ๋ฐฐ์—ด์„ ๋งŒ๋“  ๋‹ค์Œ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” Kotlin์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋“  ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž‘์—…์„ "์‹คํ–‰ ์ค‘"๊ณผ "๋Œ€๊ธฐ ์ค‘"์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.


๋”ฐ๋ผ์„œ ์•”์‹œ์  ๋ฒ„์ „์€ C#๊ณผ ๊ฐ™์€ ํ›จ์”ฌ ๋” ์•”์‹œ์ ์ธ ์–ธ์–ด์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
u8 ๋ฅผ i32 ๋กœ ์•”์‹œ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ทœ์น™์ด ์žˆ๋Š” Rust์—์„œ๋Š” ํ›จ์”ฌ ๋” ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Pzixel ์˜ˆ, ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์ด ๋” ์„ ํ˜ธ๋˜๋Š” ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. C#์—์„œ๋„ async/await ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ๋ช‡ ๋…„ ๋™์•ˆ ์ฃผ๋กœ C#์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„๋Š” await (future?) ๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@rpjohnst ์ €๋Š” ํ›„์œ„ ์—ฐ์‚ฐ์ž๋ผ๋Š” ๊ฐœ๋…์ด ๋งˆ์Œ์— struct ๋ผ๋Š” await ์˜ ๊ตฌ์„ฑ์›์—๊ฒŒ๋Š” ์‰ฝ๊ฒŒ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

์ž‘์—… ์‹œ์ž‘๊ณผ ์ž‘์—… ๋Œ€๊ธฐ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฐ€๋Šฅ์„ฑ์€ ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•”์‹œ์  ๋ฒ„์ „ ์ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. RFC ์Šค๋ ˆ๋“œ์™€ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ๋ชจ๋‘์—์„œ ์ฃฝ์„ ์ •๋„๋กœ ๋…ผ์˜๋˜์—ˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ๋ช…์‹œ์„ฑ์„ ์ž‘์—… ๋Œ€๊ธฐ์—์„œ ์ž‘์—… ๊ตฌ์„ฑ์œผ๋กœ ์ด๋™ ํ•œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•”์‹œ๋ฅผ ๋„์ž…ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๊ท€ํ•˜์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pub async fn get_statuses() -> Vec<StatusUpdate> {
    // get_status_updates is also an `async fn`, but calling it works just like any other call:
    let count = get_status_updates();

    let mut tasks = vec![];
    for i in 0..count {
        // Here is where task *construction* becomes explicit, as an async block:
        task.push(async {
            // Again, simply *calling* get_status_update looks just like a sync call:
            let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
            StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
        });
    }

    // And finally, launching the explicitly-constructed futures is also explicit, while awaiting the result is implicit:
    join_all(&tasks[..])
}

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ "์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ฏธ๋ž˜๋ฅผ ๊ฑด์„คํ•˜๋Š” ํ–‰์œ„๋„ ๋ช…์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค"๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ์ฝ”๋“œ์—์„œ ์Šค๋ ˆ๋“œ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ํ˜ธ์ถœ์ž๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋™์‹œ์„ฑ์„ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋กœ์ € ๋ฐ thread::spawn / join ๋Š” ๋น„๋™๊ธฐ ๋ธ”๋ก ๋ฐ join_all / select /etc์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•”์‹œ์  ๋ฒ„์ „์ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. RFC ์Šค๋ ˆ๋“œ์™€ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ๋ชจ๋‘์—์„œ ์ฃฝ์„ ์ •๋„๋กœ ๋…ผ์˜๋˜์—ˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ๋ช…์‹œ์„ฑ์„ ์ž‘์—… ๋Œ€๊ธฐ์—์„œ ์ž‘์—… ๊ตฌ์„ฑ์œผ๋กœ ์ด๋™ํ•œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•”์‹œ๋ฅผ ๋„์ž…ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฏฟ๋Š”๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด ํ•จ์ˆ˜์˜ ํ๋ฆ„์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋Š” ๋Œ€๊ธฐ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰์ด ์ค‘๋‹จ๋˜๋Š” ์ง€์ ์ž…๋‹ˆ๋‹ค. async ๋ธ”๋ก๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๊ธฐ ์–ด๋”˜๊ฐ€์— ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด์„ธ์š”. ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!"

๋˜ ๋‹ค๋ฅธ ์š”์ : Rust๋Š” ๋ฒ ์–ด๋ฉ”ํƒˆ ๋“ฑ์— ๊ฐ€๊นŒ์šด ๋ชจ๋“  ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์ธ ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹นํžˆ ์ธ๊ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ๋ณด์—ฌ ์ฃผ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var a = await fooAsync(); // awaiting first task
var b = barAsync(); //running second task
var c = await bazAsync(); // awaiting third task
if (c.IsSomeCondition && !b.Status = TaskStatus.RanToCompletion) // if some condition is true and b is still running
{
   var firstFinishedTask = await Task.Any(b, Task.Delay(5000)); // waiting for 5 more seconds;
   if (firstFinishedTask != b) // our task is timeouted
      throw new Exception(); // doing something
   // more logic here
}
else
{
   // more logic here
}

Rust๋Š” ํ•ญ์ƒ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. await ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ์† ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ์ง€์ ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ future ๋‚ด๋ถ€์˜ ๊ฐ’์„ unwrap ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ์•”์‹œ์  ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์šฐ์„ , ์ด ๋™์ž‘์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋ ค๋ฉด ๋”๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด์ œ RLS์™€ IDE๋Š” ์šฐ๋ฆฌ์˜ ๊ฐ’์ด Future<T> ์ด๊ฑฐ๋‚˜ T ์ž์ฒด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ์˜ˆ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” T ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Future<T>
  3. ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์˜ˆ์—์„œ๋Š” get_status_updates ๋ผ์ธ์—์„œ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ get_status_update ์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์„œ๋กœ ์ƒ๋‹นํžˆ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์›๋ž˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์„œ ์ฃผ์ œ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ์–ด๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ๋Œ€์•ˆ ๋ชจ๋‘ ์ด ์˜ต์…˜์„ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ด ํ•จ์ˆ˜์˜ ํ๋ฆ„์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋Š” ๋Œ€๊ธฐ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰์ด ์ค‘๋‹จ๋˜๋Š” ์ง€์ ์ž…๋‹ˆ๋‹ค.

๋„ค, ์ด๊ฒƒ์ด ์ œ๊ฐ€ "์ด๊ฒƒ์€ ์„œ์ŠคํŽœ์…˜ ํฌ์ธํŠธ๋ฅผ ๋” ๋ณด๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค"๋Š” ๋ง์˜ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ๋ฉด ์ด๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ์ฃผ์žฅ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ์„์„ ๋‹ค๋ฅธ ์œ„์น˜์— ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค( await ์‹ ๋Œ€์‹  async ๋ธ”๋ก). ์‹ญ์˜ค์€ ์•„๋ฌด ๋ฌธ์ œ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์ด์•ผ๊ธฐํ•˜์ง€์ด (๊ฐ€ ํ•ญ์ƒ T ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ ๋Œ€ํ•œ Future<Output=T> ์— async ๋ธ”๋ก).

๋˜ํ•œ ๊ตฌ๋ฌธ์— ๊ด€๊ณ„์—†์ด ๊ท€ํ•˜์˜ ์ดํ•ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. Rust์˜ async ํ•จ์ˆ˜ ๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋Œ€๊ธฐ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ์‹คํ–‰ b.Status != TaskStatus.RanToCompletion ๊ฒ€์‚ฌ๋Š” ํ•ญ์ƒ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RFC ์Šค๋ ˆ๋“œ์—์„œ ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ๋Š” get_status_updates ํ–‰์—์„œ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ get_status_update ์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์„œ๋กœ ์ƒ๋‹นํžˆ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‘ ๊ณณ ๋ชจ๋‘์—์„œ ์ธํ„ฐ๋ŸฝํŠธ ์‹คํ–‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ async ๋ธ”๋ก์ด ๋Œ€๊ธฐํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ Rust์˜ ๋ชจ๋“  ์„ ๋ฌผ์— ํ•ด๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ์—์„œ, get_statuses ํ†ตํ™” (๋”ฐ๋ผ์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ ) get_status_updates , ๋‹ค์Œ ๋ฃจํ”„๋Š” ๊ตฌ์ถ• (๊ทธ๋Ÿฌ๋‚˜ ์•Š์Šต๋‹ˆ๋‹ค await๋ฅผํ•˜์ง€ ์•Š์Œ) count ์„ ๋ฌผ, ๊ทธ๊ฒƒ์€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ํ˜ธ์ถœ (๋”ฐ๋ผ์„œ ) join_all , ์ด ์‹œ์ ์—์„œ ํ•ด๋‹น ์„ ๋ฌผ์€ ๋™์‹œ์— get_status_update ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์™€์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ๋ฏธ๋ž˜๊ฐ€ ์ •ํ™•ํžˆ ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋•Œ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฃจํ”„ ์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์—์„œ๋Š” join_all ๋™์•ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์•”์‹œ์  ๊ตฌ๋ฌธ์ด๋‚˜ async / await ์™€ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ Rust future๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ทผ๋ณธ์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ตฌ๋ฌธ์— ๊ด€๊ณ„์—†์ด ๊ท€ํ•˜์˜ ์ดํ•ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. Rust์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ธฐ๋‹ค๋ฆด ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ b.Status != TaskStatus.RanToCompletion ๊ฒ€์‚ฌ๋Š” ํ•ญ์ƒ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, C# ์ž‘์—…์€ ์ฒซ ๋ฒˆ์งธ ์ผ์‹œ ์ค‘๋‹จ ์ง€์ ๊นŒ์ง€ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ง€์ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋จธ์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ผ๋ถ€ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

var a = await fooAsync(); // awaiting first task
var b = Task.Run(() => barAsync()); //running background task somehow
// the rest of the method is the same

async ๋ธ”๋ก์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ณด๊ธฐ์— ๊ทธ๊ฒƒ๋“ค์€ ๊ฐ™์€ ์ง์Šน์ด์ง€๋งŒ ๋” ๋งŽ์€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์ œ์•ˆ์—์„œ ๊ฐ ๋น„๋™๊ธฐ ์ž‘์—…์€ await ์™€ ์Œ์„ ์ด๋ฃน๋‹ˆ๋‹ค. async ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์ž‘์—…์€ ๊ฑด์„ค ์ง€์ ์—์„œ async ๋ธ”๋ก๊ณผ ์Œ์„ ์ด๋ฃจ๋ฏ€๋กœ ์ด์ „๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ์ƒํ™ฉ(1:1 ๊ด€๊ณ„)์— ์žˆ์ง€๋งŒ ์กฐ๊ธˆ ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์‚ฌ์ดํŠธ ๋™์ž‘์ด ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด let a = foo() ๋˜๋Š” let b = await foo() ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์ž‘์—…์ด ๋ฐฉ๊ธˆ ๊ตฌ์„ฑ๋˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ๋˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ๊ฒฝ์šฐ let a = foo() ์™€ async ๋ธ”๋ก I๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋ณผ ํ•„์š”๊ฐ€ ์ผ๋ถ€ async ์ด์ƒ, ๋‚˜๋Š” ๋•Œ๋ฌธ์—์ด ๊ฒฝ์šฐ์—๋Š”, ๋ฐ”๋กœ ๋‹น์‹ ์„ ์–ป์„ ๊ฒฝ์šฐ

pub async fn get_statuses() -> Vec<StatusUpdate> {
    // get_status_updates is also an `async fn`, but calling it works just like any other call:
    let count = get_status_updates();

    let mut tasks = vec![];
    for i in 0..count {
        // Here is where task *construction* becomes explicit, as an async block:
        task.push(async {
            // Again, simply *calling* get_status_update looks just like a sync call:
            let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
            StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
        });
    }

    // And finally, launching the explicitly-constructed futures is also explicit, while awaiting the result is implicit:
    join_all(&tasks[..])
}

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋™์•ˆ ๋ชจ๋“  ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

pub async fn get_statuses() -> Vec<StatusUpdate> {
    // get_status_updates is also an `async fn`, but calling it works just like any other call:
    let count = get_status_updates();

    let mut tasks = vec![];
    for i in 0..count {
        // Isn't "just a construction" anymore
        task.push({
            let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
            StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
        });
    }
    tasks 
}

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜๊ฐ€ ๋˜์–ด ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์˜ ์ •ํ™•ํ•œ ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))

๋” ๋งŽ์€ ์ปจํ…์ŠคํŠธ ์—†์ด.

๊ทธ๋ฆฌ๊ณ  ์ค‘์ฒฉ๋œ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํ™ฉ์ด ๋” ์ด์ƒํ•ด์ง‘๋‹ˆ๋‹ค. ํˆด๋ง ๋“ฑ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ์‚ฌ์ดํŠธ ๋™์ž‘์€ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋ฏธ ์ผ๋ฐ˜ ๋™๊ธฐํ™” ์ฝ”๋“œ์™€ ํด๋กœ์ €์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

// Construct a closure, delaying `do_something_synchronous()`:
task.push(|| {
    let data = do_something_synchronous();
    StatusUpdate { data }
});

๋Œ€

// Execute a block, immediately running `do_something_synchronous()`:
task.push({
    let data = do_something_synchronous();
    StatusUpdate { data }
});

์ „์ฒด ์•”์‹œ์  await ์ œ์•ˆ์—์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ์€ async ๊ฐ€ ์•„๋‹Œ ์ปจํ…์ŠคํŠธ์—์„œ async fn ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, some_function ๊ฐ€ async ์ธ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ some_function(arg1, arg2, etc) ์€ ํ˜ธ์ถœ์ž๊ฐ€ ๊ณ„์†๋˜๊ธฐ ์ „์— some_function ์˜ ๋ณธ๋ฌธ์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ํ•ญ์ƒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ async ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์€ ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์€ ์‹ค์ œ๋กœ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

await ๊ตฌ๋ฌธ ๊ด€๋ จ: ๋ฉ”์„œ๋“œ ๊ตฌ๋ฌธ์ด ์žˆ๋Š” ๋งคํฌ๋กœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ์‹ค์ œ RFC๋ฅผ ์ฐพ์„ ์ˆ˜๋Š” ์—†์ง€๋งŒ reddit์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ† ๋ก ( 1 , 2 )์„ ์ฐพ์•˜์œผ๋ฏ€๋กœ ์•„์ด๋””์–ด๋Š” ์ „๋ก€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ ‘๋ฏธ์‚ฌ ์œ„์น˜์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค / ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋งŒ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

// Postfix await-as-a-keyword. Looks as if we were accessing a Result<_, _> field,
// unless await is syntax-highlighted
first().await?.second().await?.third().await?
// Macro with method syntax. A few more symbols, but clearly a macro invocation that
// can affect control flow
first().await!()?.second().await!()?.third().await!()?

๋ชจ๋‚˜๋“œ ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” Scala-world ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. http://monadless.io

Rust์—๊ฒŒ ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด๊ฐ€ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋ฌธ์„œ์—์„œ ์ธ์šฉ:

๋Œ€๋ถ€๋ถ„์˜ ์ฃผ๋ฅ˜ ์–ธ์–ด๋Š” async/await ๊ด€์šฉ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: F#, C#/VB, Javascript, Python, Swift). ์œ ์šฉํ•˜๊ธด ํ•˜์ง€๋งŒ async/await๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„๋™๊ธฐ ๊ณ„์‚ฐ(Task, Future ๋“ฑ)์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ • ๋ชจ๋‚˜๋“œ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” async/await์™€ ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ชจ๋‚˜๋“œ ์œ ํ˜•์œผ๋กœ ์ผ๋ฐ˜ํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ์ผ๋ฐ˜ํ™”๋Š” ์ผ๋ถ€ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋น„๋™๊ธฐ์‹ ๊ณ„์‚ฐ์„ ์œ„ํ•ด Future ์™ธ์— Task์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ชจ๋‚˜๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋Š” ์ฃผ์š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.

M ๋ชจ๋‚˜๋“œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ผ๋ฐ˜ํ™”์—์„œ๋Š” ์ผ๋ฐ˜ ๊ฐ’์„ ๋ชจ๋‚˜๋“œ๋กœ ๋“ค์–ด์˜ฌ๋ฆฌ๋Š” ๊ฐœ๋…( T => M[T] )๊ณผ ๋ชจ๋‚˜๋“œ ์ธ์Šคํ„ด์Šค์—์„œ ๊ฐ’์„ ํ•ด์ œํ•˜๋Š” ๊ฐœ๋…( M[T] => T )์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. > ์‚ฌ์šฉ ์˜ˆ:

lift {
  val a = unlift(callServiceA())
  val b = unlift(callServiceB(a))
  val c = unlift(callServiceC(b))
  (a, c)
}

๋ฆฌํ”„ํŠธ๋Š” async ๋ฐ unlift to wait์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋ฏธ ์ผ๋ฐ˜ ๋™๊ธฐํ™” ์ฝ”๋“œ์™€ ํด๋กœ์ €์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Lambda ์ปจํ…์ŠคํŠธ๋Š” ํ”ผํ•  ์ˆ˜ ์—†์ง€๋งŒ await ์šฉ await ์—๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†๊ณ  async ์—๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ž๋Š” ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋œ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. ๋žŒ๋‹ค๋Š” ์งง์•„์„œ ๊ธฐ๊ปํ•ด์•ผ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋˜์–ด ์žˆ์–ด ๋ชธ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๋ณผ ์ˆ˜ ์žˆ๊ณ  ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. async ํ•จ์ˆ˜๋Š” ์ƒ๋‹นํžˆ ํฌ๊ณ (์ผ๋ฐ˜ ํ•จ์ˆ˜๋งŒํผ ํฌ๋ฉฐ) ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Lambda๋Š” ๊ฑฐ์˜ ์ค‘์ฒฉ๋˜์ง€ ์•Š์œผ๋ฉฐ( then ํ˜ธ์ถœ์„ ์ œ์™ธํ•˜๊ณ ๋Š” await ๊ฐ€ ์ œ์•ˆ๋จ) async ๋ธ”๋ก์€ ์ž์ฃผ ์ค‘์ฒฉ๋ฉ๋‹ˆ๋‹ค.

์ „์ฒด ์•”์‹œ์  ๋Œ€๊ธฐ ์ œ์•ˆ์—์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ์€ ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ์—์„œ async fns๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ , ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ˆˆ์น˜ ์ฑ„์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์—ฐ์Šต์—์„œ๋Š” ์ข…์ข… ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹Œ ์ปจํ…์ŠคํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹๊ฒŒ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์—์„œ async ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ‚ค์›Œ๋“œ์ผ ๋ฟ์ด๋ฉฐ ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ async Task<Foo> ๋ฐ Task<Foo> ๋Š” ์™„์ „ํžˆ ์ƒํ˜ธ ๊ตํ™˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ตฌํ˜„๊ณผ API๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋•Œ๋กœ๋Š” async ์ž‘์—…์„ ์ฐจ๋‹จํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: main ์—์„œ ์ผ๋ถ€ ๋„คํŠธ์›Œํฌ API๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ). ์ฐจ๋‹จํ•ด์•ผ ํ•˜์ง€๋งŒ(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด OS๋กœ ๋Œ์•„๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋จ) ๋น„๋™๊ธฐ HTTP ์š”์ฒญ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. main ๋ฅผ ํ•ดํ‚นํ•˜์—ฌ ๋น„๋™๊ธฐ๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๊ณผ Result ๊ธฐ๋ณธ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์—ฌ๊ธฐ์— ์–ด๋–ค ์†”๋ฃจ์…˜์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค

ํ˜„์žฌ await ์— ์ฐฌ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋‹ค๋ฅธ ์ธ๊ธฐ ์žˆ๋Š” ์–ธ์–ด์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค( @fdietze ์—์„œ ์–ธ๊ธ‰

์—ฌ๊ธฐ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ณธ RFC์—๋Š” ์•”์‹œ์  ๋ฒ„์ „๊ณผ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ async ๋ธ”๋ก์ด ์ด๋ฏธ ์žˆ์Œ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์—ฐ์Šต์—์„œ๋Š” ์ข…์ข… ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹Œ ์ปจํ…์ŠคํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹๊ฒŒ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค async ๋น„์— ๋ธ”๋ก async (๊ทธ๋“ค์€ ๋‹จ์ง€๋กœ ํ‰๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋˜๋Š” ์ƒํ™ฉ์„ F: Future ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ), ๋‹น์‹ ์€ ์„ ๋ฌผ ๋˜๋Š” ๋ธ”๋ก ์‚ฐ๋ž€ ์—ฌ์ „ํžˆ ์ˆ˜ ์ด์ „๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค async fn ๋“ค ๋Œ€์‹ ์— ๊ทธ๋“ค์—๊ฒŒ ์ „ํ™”๋ฅผ ํฌ์žฅ async ๋ธ”๋ก - ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋‹น์‹ ์ด ์ƒ๊ด€์—†์ด,์—์žˆ์–ด ๋ฌธ๋งฅ์˜ ์ˆ˜ํ–‰์œผ๋กœ F: Future .

async๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ‚ค์›Œ๋“œ์ผ ๋ฟ์ด๋ฉฐ ์–ด๋–ค ์‹์œผ๋กœ๋“  ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ ์ œ์•ˆ ๊ฐ„์˜ ํ•ฉ๋ฒ•์ ์ธ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ๋„ ๋ฎ์—ฌ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ‹€๋ฆผ์—†์ด, async fn ๋ฒ„์ „์€ ๊ตฌ์„ฑ์˜ ์ผ๋ถ€๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด -> impl Future ๋ฒ„์ „์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ ์ „์— ์š”์ฒญ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. F: Future . ๋˜ํ•œ ์ˆ˜ async fn ์˜ ์ •์ƒ๊ณผ ์ผ๊ด€์„ฑ fn ํ˜ธ์ถœ ๋ญ”๊ฐ€๋กœ ์„ ์–ธ ๋œ ๊ฒƒ์„๋“ค์—์„œ -> T ํ•ญ์ƒ ๋‹น์‹ ์—๊ฒŒ ์ค„ ๊ฒƒ์ด๋‹ค T , ๊ด€๊ณ„์—†์ด ์—ฌ๋ถ€์˜ async .

(Rust์—์„œ๋Š” RFC์— ์„ค๋ช…๋œ ๋Œ€๋กœ async fn ์™€ Future ๋ฐ˜ํ™˜ ๋ฒ„์ „ ์‚ฌ์ด์— ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ๋„์•ฝ ์ด ์žˆ์Œ์„ ์ฃผ๋ชฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. async fn ๋ฒ„์ „์—์„œ๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Future ์„œ๋ช…์˜ ์•„๋ฌด ๊ณณ์ด๋‚˜ ํ•„์š”ํ•˜๊ณ  ์ˆ˜๋™ ๋ฒ„์ „์—๋Š” impl Trait ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด๋Š” ์ˆ˜๋ช…๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ async fn ์— ๋Œ€ํ•œ ๋™๊ธฐ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค

C#/TypeScript/JS/Python๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์‰ฝ๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฆฌํ„ฐ๋Ÿด await future ๊ตฌ๋ฌธ ์—๋งŒ ์ด์ ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” Rust ์ž์ฒด์—์„œ ์ƒ๋‹นํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ ์—ญ์‹œ ํ•ด๋‹น ์–ธ์–ด์™€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฐ˜๋ฉด ์•”์‹œ์  await๋Š” ์ตœ์†Œํ•œ a) Kotlin๊ณผ์˜ ์œ ์‚ฌ์  ๋ฐ b) ๋™๊ธฐ์‹ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ์™€์˜ ์œ ์‚ฌ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ ์ œ์•ˆ ๊ฐ„์˜ ํ•ฉ๋ฒ•์ ์ธ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ๋„ ๋ฎ์—ฌ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ‹€๋ฆผ์—†์ด ๋‘˜์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์˜์กดํ•˜๋Š” API๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ข‹์ง€ ์•Š๊ฒŒ ๋“ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— _๋‘ ๊ฐ€์ง€์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ˆœํžˆ ๋‚ด๋ถ€ future์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์œ„์ž„ํ•˜๋Š” ๊ณ„์•ฝ์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

fn foo(&self) -> Future<T> {
   self.myService.foo()
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ผ๋ถ€ ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

async fn foo(&self) -> T {
   let result = await self.myService.foo();
   self.logger.log("foo executed with result {}.", result);
   result
}

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์™€?

์ด๊ฒƒ์€ ๋ฆฌํ„ฐ๋Ÿด await future ๊ตฌ๋ฌธ์—๋งŒ ์ด์ ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” Rust ์ž์ฒด์—์„œ ์ƒ๋‹นํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ ์—ญ์‹œ ํ•ด๋‹น ์–ธ์–ด์™€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฐ˜๋ฉด ์•”์‹œ์  await๋Š” ์ตœ์†Œํ•œ a) Kotlin๊ณผ์˜ ์œ ์‚ฌ์  ๋ฐ b) ๋™๊ธฐ์‹ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ์™€์˜ ์œ ์‚ฌ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

await ๊ตฌ๋ฌธ, await foo / foo await / foo@ / foo.await /... ๋™์ผํ•˜์ง€๋งŒ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์•ž/๋’ค์— ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ ํ‚ค์›Œ๋“œ ๋Œ€์‹  ์ธ์žฅ์„ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ RFC์— ์„ค๋ช…๋œ ๋Œ€๋กœ Rust์—์„œ๋Š” async fn๊ณผ Future-returning ๋ฒ„์ „ ์‚ฌ์ด์— ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ๋„์•ฝ์ด ์žˆ์Œ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ๋งŽ์ด ๋ถˆ์•ˆํ•˜๊ฒŒ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

async ๋ธ”๋ก์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”์‹œ์  ๋Œ€๊ธฐ ์ œ์•ˆ์—์„œ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

fn foo(&self) -> impl Future<Output = T> { // Note: you never could return `Future<T>`...
    async { self.my_service.foo() } // ...and under the proposal you couldn't call `foo` outside of `async` either.
}

๊ทธ๋ฆฌ๊ณ  ๋กœ๊น…:

fn foo(&self) -> impl Future<Output = T> {
    async {
        let result = self.my_service.foo();
        self.logger.log("foo executed with result {}.", result);
        result
    }
}

์ด๋Ÿฌํ•œ ๊ตฌ๋ถ„์— ๋Œ€ํ•œ ๋” ํฐ ๋ฌธ์ œ๋Š” ์ˆ˜๋™ ๋ฏธ๋ž˜ ๊ตฌํ˜„ ๋ฐ ๊ฒฐํ•ฉ๊ธฐ(์˜ค๋Š˜๋‚  ์œ ์ผํ•œ ๋ฐฉ๋ฒ•)์—์„œ async/await๋กœ ์ƒํƒœ๊ณ„๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋•Œ์—๋„ ์ œ์•ˆ์„ ํ†ตํ•ด ์ด์ „ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ทธ์™€ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๋น„๋™๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C#์€ ๊ทธ ํŒจํ„ด์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฐ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ์•”์‹œ์ (์—ฌ๊ธฐ์„œ foo() ์ด ๋น„๋™๊ธฐ ๋˜๋Š” ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Œ)์ด COM+์™€ ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜๊ณ  WCF๊ฐ€ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„๋˜๋Š” ์ด์œ ๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค

์ด ์ฝ”๋“œ๋Š” ๋น„๋™๊ธฐ์ธ์ง€ ๋™๊ธฐํ™”์ธ์ง€ ์ผ๋ถ€ ์š”์ฒญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ •๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

fn foo(&self) -> impl Future<Output = T> {
    async {
        let result = self.my_service.foo();
        self.logger.log("foo executed with result {}.", result);
        let bars: Vec<Bar> = Vec::new();
        for i in 0..100 {
           bars.push(self.my_other_service.bar(i, result));
        }
        result
    }
}

bar ๊ฐ€ ๋™๊ธฐํ™” ๋˜๋Š” ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์ธ์ง€ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„์—์„œ await ๊ฐ€ ๋กœ๋“œ์™€ ์„ฑ๋Šฅ ์ „๋ฐ˜์— ๊ฑธ์ณ ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ‘œ์‹œ๋กœ ์ž์ฃผ ๋ด…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์–ด์ œ ๊ฒ€ํ† ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค(์ฝ”๋“œ๋Š” ์ฐจ์„ ์ฑ…์ด์ง€๋งŒ ๊ฒ€ํ†  ๋ฐ˜๋ณต ์ค‘ ํ•˜๋‚˜์ž„).

image

๋ณด์‹œ๋‹ค์‹œํ”ผ ์—ฌ๊ธฐ์—์„œ ๋ฃจํ•‘์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Œ์„ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋ณ€๊ฒฝ์„ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ปค๋ฐ‹๋˜์—ˆ์„ ๋•Œ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๊ฐ€ 3๋ฐฐ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. await ์—†์ด๋Š” ์ด ์ž˜๋ชป๋œ ํ–‰๋™์„ ์‰ฝ๊ฒŒ ๊ฐ„๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Kotlin์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•˜์ง€๋งŒ ์ง€๋‚œ๋ฒˆ์— ๊ทธ ์–ธ์–ด๋ฅผ ๋ณด์•˜์„ ๋•Œ ๊ธฐ๊ณ„์ ์œผ๋กœ ํ•˜๋‚˜๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ฒˆ์—ญํ•˜๊ธฐ ์‰ฌ์šด ์ง€์ ๊นŒ์ง€ ๊ตฌ๋ฌธ์ด ์ ์€ Java์˜ ๋ณ€ํ˜•์ธ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๊ฒƒ์ด Java์˜ ์„ธ๊ณ„(์•ฝ๊ฐ„ ๊ตฌ๋ฌธ์ด ๋ฌด๊ฑฐ์šด ๊ฒฝํ–ฅ์ด ์žˆ์Œ)์—์„œ ์„ ํ˜ธ๋˜๋Š” ์ด์œ ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ Java๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๊ทผ์— ์ธ๊ธฐ๊ฐ€ ๋†’์•„์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(Oracle ๋Œ€ Google ์ƒํ™ฉ ).

๊ทธ๋Ÿฌ๋‚˜ ์ธ๊ธฐ๋„์™€ ์นœ์ˆ™๋„๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด JavaScript๊ฐ€ ํ•˜๋Š” ์ผ์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” await ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, await ๋Š” C#์— ์˜ํ•ด ์ฃผ๋ฅ˜ ์–ธ์–ด์— ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. C#์€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ฒจ์ง€๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C#์—์„œ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์€ await ํ‚ค์›Œ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ Async ์ ‘๋ฏธ์‚ฌ๋กœ๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. await , yield return ์™€ ๊ฐ€์žฅ ๋งŽ์ด ๊ณต์œ ๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด ๊ธฐ๋Šฅ๋„ ์ฝ”๋“œ์—์„œ ๋‘๋“œ๋Ÿฌ์ง€๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ ๊ทธ๋Ÿฐ ๊ฒ๋‹ˆ๊นŒ? ์ œ ์ƒ๊ฐ์€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ๋น„๋™๊ธฐ์‹ ํ˜ธ์ถœ์ด ์ฝ”๋“œ์—์„œ ๋ˆˆ์— ๋„์ง€ ์•Š๊ฒŒ ์ „๋‹ฌ๋˜๋„๋ก ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๊ฐ•๋ ฅํ•œ ๊ตฌ์กฐ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž์˜ ๊ณ„์ธต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ช…๋ น๋ฌธ์˜ ์ˆœ์ฐจ์  ์‹คํ–‰(์•”์‹œ์ )
  • ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ ํ˜ธ์ถœ(๋งค์šฐ ๋ถ„๋ช…ํ•จ, ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ nullary ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜ ์‚ฌ์ด์— ์ฐจ์ด๊ฐ€ ์—†๋Š” Pascal ์™€ ๋น„๊ต)
  • goto (์ข‹์•„์š”, ์—„๊ฒฉํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค)
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ( yield return ๊ฐ€ ๋ˆˆ์— ๋„๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ)
  • await + Async ์ ‘๋ฏธ์‚ฌ

ํ‘œํ˜„๋ ฅ์ด๋‚˜ ํž˜์— ๋”ฐ๋ผ ๊ทธ๊ฒƒ๋“ค์ด ๋œ ์žฅํ™ฉํ•œ ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์–ด๋–ป๊ฒŒ ๋” ์žฅํ™ฉํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค.

๋ฌผ๋ก  ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ–ˆ์Šต๋‹ˆ๋‹ค. (์—์„œ์™€ ๊ฐ™์€ ์ œ๋„์˜ ์—ฐ์†์„ฑ์„ call/cc ์—์„œ ๋„ˆ๋ฌด ๋‹ค๋ฅด์ง€ ์•Š๋‹ค, await ๋˜๋Š” ๋งคํฌ๋กœ)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ ์–ด๋–ค ๊ตฌ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋งคํฌ๋กœ์˜ ๊ฒฝ์šฐ Rust๋Š” ๋งคํฌ๋กœ๋ฅผ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ตฌ๋ฌธ์ด ๋” ์ ์€ ๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์œผ๋ฉฐ(์ด๋ฅผ ์œ„ํ•ด APL ๋˜๋Š” Perl๊ณผ ๊ฐ™์€ ์–ธ์–ด๊ฐ€ ์žˆ์Œ) ํ•ด๋‹น ๊ตฌ๋ฌธ์ด ์ƒ์šฉ๊ตฌ์ผ ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ๊ฐ€๋…์„ฑ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์žˆ์„ ๋•Œ ์‹œ๋„๋Ÿฌ์šด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ์•ˆํ•˜์ง€๋งŒ ๋‹ค์Œ์—๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด ๋œ ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.


await!(foo)? ๋Œ€ await foo? ์˜ ์งˆ๋ฌธ์— ๊ด€ํ•ด์„œ๋Š” ์ €๋Š” ์ด์ „ ์บ ํ”„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ๋‚ด๋ถ€ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ฐ„๊ฒฉ๊ณผ ๊ทผ์ ‘์—์„œ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๋Š” ๋ฐ ๋„ˆ๋ฌด ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. await foo? ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๊ด„ํ˜ธ๊ฐ€ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋Š” ๋™์•ˆ ๋‘ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์Šค์Šค๋กœ ์ถ”์ธกํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 3๋ช…์˜ ์บ๋ฆญํ„ฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  await! ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ฐ์Šต์— ๊ด€ํ•ด์„œ๋Š” ์ผ๋ถ€ ์–ธ์–ด์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ด€์šฉ๊ตฌ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์ ํ™”ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฐ€๋…์„ฑ ๋ฐ ๋””๋ฒ„๊ฑฐ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

3๋ช…์˜ ์บ๋ฆญํ„ฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์ผํ™”์ ์ธ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ถ”๊ฐ€ ๋ฌธ์ž(์˜ˆ: ๋” ๊ธด ์ด๋ฆ„)๋Š” ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ ์ถ”๊ฐ€ ํ† ํฐ์€ ์ •๋ง ์งœ์ฆ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CPU ๋น„์œ ์™€ ๊ด€๋ จํ•˜์—ฌ ๊ธด ์ด๋ฆ„์€ ์ง€์—ญ์„ฑ์ด ์ข‹์€ ์ง์„  ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๊ทผ์œก ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ทธ๋ƒฅ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์—ฌ๋Ÿฌ ํ† ํฐ(์˜ˆ: ๊ตฌ๋‘์ )๊ณผ ๊ด€๋ จ๋œ ๋™์ผํ•œ ์ˆ˜์˜ ๋ฌธ์ž๋Š” ๊ฐ€์ง€๊ฐ€ ์—†๊ณ  ์บ์‹œ ๋ˆ„๋ฝ์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค.

( await foo? ๋Š” ๋งค์šฐ ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋ฅผ ํ”ผํ•ด์•ผ ํ•˜๋ฉฐ ๋” ๋งŽ์€ ํ† ํฐ์„ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ด€์ฐฐ์— ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ƒ์„ฑ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.)


@rpjohnst ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋Œ€์•ˆ ์ œ์•ˆ์ด "์•”์‹œ์  ๋Œ€๊ธฐ"๊ฐ€ ์•„๋‹Œ "๋ช…์‹œ์  ๋น„๋™๊ธฐ"๋กœ ์ œ์‹œ๋œ๋‹ค๋ฉด ์•ฝ๊ฐ„ ๋” ๋‚˜์€ ์ˆ˜์šฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :-)

bar ๊ฐ€ ๋™๊ธฐํ™” ๋˜๋Š” ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์ธ์ง€ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์‹ธ๊ฑฐ๋‚˜ ๋น„์‹ผ์ง€, IO๋ฅผ ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€, ๋˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์ „์—ญ ์ƒํƒœ์— ๋‹ฟ๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ์•„๋Š” ๊ฒƒ๊ณผ ์ •๋ง๋กœ ๋‹ค๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. (์ด๋Š” @lnicola ์˜ ๊ณ„์ธต ๊ตฌ์กฐ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ˜ธ์ถœ์ด ๋™๊ธฐํ™” ํ˜ธ์ถœ์ฒ˜๋Ÿผ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋œ๋‹ค๋ฉด ์ „๋ ฅ ์ธก๋ฉด์—์„œ ์‹ค์ œ๋กœ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค!)

์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜ธ์ถœ์ด ๋ฃจํ”„์— ์žˆ์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๊ทธ๊ฒƒ์ด ๋น„๋™๊ธฐ๋ผ๋Š” ์‚ฌ์‹ค๋ณด๋‹ค ๋” ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ‘๋ ฌํ™”๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง„ Rust์—์„œ๋Š” ๊ฐ’๋น„์‹ผ ๋™๊ธฐ ๋ฃจํ”„๋ฅผ Rayon ๋ฐ˜๋ณต์ž๋กœ ์ „ํ™˜ํ•˜๋„๋ก ์ œ์•ˆํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

๋”ฐ๋ผ์„œ await ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฃจํ”„๋Š” ์ด๋ฏธ ์ตœ์ ํ™”๋ฅผ ์ฐพ๊ธฐ์— ํ•ญ์ƒ ์ข‹์€ ์œ„์น˜์ด๋ฉฐ async fn ๋Š” ์ด๋ฏธ ์ €๋ ดํ•œ IO ๋™์‹œ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ข‹์€ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐํšŒ๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ€๋” ์‹คํ–‰ํ•˜๋Š” "๋ฃจํ”„์˜ ๋น„๋™๊ธฐ ํ˜ธ์ถœ"์— ๋Œ€ํ•ด Clippy ๋ฆฐํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ ์ฝ”๋“œ์—๋„ ๋น„์Šทํ•œ ๋ณดํ‘ธ๋ผ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

"๋ช…์‹œ์  ๋น„๋™๊ธฐํ™”"์— ๋Œ€ํ•œ ๋™๊ธฐ๋Š” @lnicola๊ฐ€ ์•”์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ "์ ์€ ๊ตฌ๋ฌธ"์ด ์•„๋‹™๋‹ˆ๋‹ค. foo() ํ•ญ์ƒ foo ์˜ ๋ณธ๋ฌธ์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•˜๋„๋ก ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์˜ ๋™์ž‘์„ ๋ณด๋‹ค ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์— ๋”ฐ๋ผ ์ฃผ์„์„ ์ƒ๋žตํ•˜๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ธ ๋œ ๋™์‹œ์ ์ธ ์ฝ”๋“œ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. "๋ช…์‹œ์  ๋Œ€๊ธฐ"์—์„œ ์ฃผ์„์„ ์ƒ๋žตํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์šฐ์—ฐํ•œ ๋™์‹œ์„ฑ ๋˜๋Š” ์ตœ์†Œํ•œ ์šฐ์—ฐํ•œ ์ธํ„ฐ๋ฆฌ๋น™์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๋Œ€์ฒด ์ œ์•ˆ์ด "์•”์‹œ์  ๋Œ€๊ธฐ"๊ฐ€ ์•„๋‹Œ "๋ช…์‹œ์  ๋น„๋™๊ธฐ"๋กœ ์ œ์‹œ๋œ๋‹ค๋ฉด ์ˆ˜์‹ ์ด ์•ฝ๊ฐ„ ๋” ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :-)

์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„์€ "๋ช…์‹œ์  ๋ฏธ๋ž˜ ๊ตฌ์„ฑ, ์•”์‹œ์  ๊ธฐ๋‹ค๋ฆผ"์ด์ง€๋งŒ ํ›„์ž์˜ ์ด๋ฆ„์ด ๊ณ ์ •๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :ํ”ผ

๋‚˜๋Š” ์ด๊ฒƒ์ด ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์‹ธ๊ฑฐ๋‚˜ ๋น„์‹ผ์ง€, IO๋ฅผ ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€, ๋˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์ „์—ญ ์ƒํƒœ์— ๋‹ฟ๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ์•„๋Š” ๊ฒƒ๊ณผ ์ •๋ง๋กœ ๋‹ค๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. (์ด๋Š” @lnicola ์˜ ๊ณ„์ธต ๊ตฌ์กฐ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ˜ธ์ถœ์ด ๋™๊ธฐํ™” ํ˜ธ์ถœ์ฒ˜๋Ÿผ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋œ๋‹ค๋ฉด ์ „๋ ฅ ์ธก๋ฉด์—์„œ ์‹ค์ œ๋กœ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค!)

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ๋งŒํผ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ˜ธ์ถœ์ž ์ธก์— mut ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

"๋ช…์‹œ์  ๋น„๋™๊ธฐํ™”"์— ๋Œ€ํ•œ ๋™๊ธฐ๋Š” @lnicola๊ฐ€ ์•”์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ "์ ์€ ๊ตฌ๋ฌธ"์ด ์•„๋‹™๋‹ˆ๋‹ค. foo()๊ฐ€ ํ•ญ์ƒ foo์˜ ๋ณธ๋ฌธ์„ ์™„๋ฃŒํ•˜๋„๋ก ์‹คํ–‰ํ•˜๋„๋ก ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์˜ ๋™์ž‘์„ ๋ณด๋‹ค ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œํŽธ์œผ๋กœ๋Š” ์ข‹์€ ํ‰๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜์—์„œ๋Š” ๋ฏธ๋ž˜ ์ƒ์„ฑ๊ณผ ๋ฏธ๋ž˜ ์‹คํ–‰์„ ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. foo ๊ฐ€ run ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒํ™”๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด foo ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ์“ธ๋ชจ์—†๋Š” ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ์ : ๋‚˜์ค‘์— ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ๊ฐœ์ฒด๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” foo ๋ฉ”์†Œ๋“œ๋Š” ๋‹จ์ง€ ๋ธ”๋ž™๋ฐ•์Šค์ด๊ณ  ์„œ๋ช… Future<Output=T> ๋ฅผ ๋ณด๊ณ  ์‹ค์ œ๋กœ ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์›ํ•  ๋•Œ ๋ช…์‹œ์ ์œผ๋กœ await ํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„์€ "๋ช…์‹œ์  ๋ฏธ๋ž˜ ๊ตฌ์„ฑ, ์•”์‹œ์  ๊ธฐ๋‹ค๋ฆผ"์ด์ง€๋งŒ ํ›„์ž์˜ ์ด๋ฆ„์ด ๊ณ ์ •๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :ํ”ผ

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด "๋ช…์‹œ์  ๋น„๋™๊ธฐ ๋ช…์‹œ์  ๋Œ€๊ธฐ"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)


์ถ”์‹ 

๋‚˜๋Š” ๋˜ํ•œ ์˜ค๋Š˜ ๋ฐค ํ•œ ์ƒ๊ฐ์— ์‚ฌ๋กœ์žกํ˜”๋‹ค. C# LDM๊ณผ ํ†ต์‹ ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด @HaloFour , @gafter ๋˜๋Š” @CyrusNajmabadi ์™€ ๊ฐ™์€ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์™œ ๊ทธ๋“ค์ด ์ทจํ•œ ๊ตฌ๋ฌธ์„ ์ทจํ–ˆ๋Š”์ง€ ๋ฌป๋Š” ๊ฒƒ์€ ์ •๋ง ์ข‹์€ ์ƒ๊ฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ๋ฌผ์–ด๋ณผ ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ €๋Š” ๊ทธ๋ƒฅ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. :) ๊ทธ๋“ค์€ ๊ธฐ์กด ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ ํ† ๋ก ํ–ˆ์œผ๋ฉฐ ์ด๋ฏธ ๋งŽ์€ ํ† ๋ก ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์œ ์šฉํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ C#์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฌ์ŠคํŠธ๊ฐ€ ์ด ๊ตฌ๋ฌธ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๋” ๊ฐ€์ค‘์น˜๋ฅผ ๋‘” ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด "๋ช…์‹œ์  ๋น„๋™๊ธฐ ๋ช…์‹œ์  ๋Œ€๊ธฐ"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

์ฃผ์š” ์ œ์•ˆ ์€ "๋ช…์‹œ์  ๋น„๋™๊ธฐ" ์•”์‹œ์  ๋น„๋™๊ธฐ"์ž…๋‹ˆ๋‹ค. ์ฃผ์„์ด ์—†๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ Future ๊ฐ€ ์„œ๋ช… ์–ด๋””์—๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋”๋ผ๋„ ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ์—๋Š” "๋ช…์‹œ์  ๋น„๋™๊ธฐ ๋ช…์‹œ์  ๋Œ€๊ธฐ" ๋Œ€์•ˆ ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. (์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์˜ ๋งˆ์ง€๋ง‰ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

C# LDM๊ณผ ํ†ต์‹ ์„ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ?

์ฃผ์š” RFC์˜ ์ž‘์„ฑ์ž๊ฐ€ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ํ•œ ๊ทธ๊ฒƒ์—์„œ ๋‚˜์˜จ ์š”์ ์€ async fn ์˜ ์„œ๋ช…์— Future ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. C#์—์„œ๋Š” Task ๋ฅผ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ๊ตฌ๋™๋˜๋Š” ๋ฐฉ์‹์„ ์–ด๋Š ์ •๋„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust์—์„œ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋ชจ๋“  ํ“จ์ฒ˜๋Š” ๋‹จ์ผ ํŠน์„ฑ์„ ๊ฑฐ์น˜๋ฏ€๋กœ ๋งค๋ฒˆ ํ•ด๋‹น ํŠน์„ฑ์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ Dart ์–ธ์–ด ๋””์ž์ด๋„ˆ๋“ค๊ณผ ์˜์‚ฌ์†Œํ†ต์„ ํ–ˆ๊ณ  ์ด๊ฒƒ์ด "๋ช…์‹œ์  ๋น„๋™๊ธฐ" ์ œ์•ˆ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๋™๊ธฐ์˜ ํฐ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. Dart 1์€ ํ•จ์ˆ˜ ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ฒซ ๋ฒˆ์งธ await๋กœ ์‹คํ–‰ ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ํ˜ธ์ถœ๋  ๋•Œ ์ „์ฒด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ˜ผ๋ž€์„ ํ”ผํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ Dart ์–ธ์–ด ๋””์ž์ด๋„ˆ๋“ค๊ณผ ์˜์‚ฌ์†Œํ†ต์„ ํ–ˆ๊ณ  ์ด๊ฒƒ์ด "๋ช…์‹œ์  ๋น„๋™๊ธฐ" ์ œ์•ˆ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๋™๊ธฐ์˜ ํฐ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. Dart 1์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ฒซ ๋ฒˆ์งธ await๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ (Rust๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์™„์ „ํžˆ ๊ฐ™์ง€๋Š” ์•Š์ง€๋งŒ ๋น„์Šทํ•จ) ์—„์ฒญ๋‚œ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•˜์—ฌ Dart 2์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋  ๋•Œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. Rust๋Š” ๋‹ค๋ฅธ ์ด์œ ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ํ˜ธ์ถœ๋  ๋•Œ ์ „์ฒด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ˜ผ๋ž€์„ ํ”ผํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ๊ฒฝํ—˜, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์—„์ฒญ๋‚œ ์ผ์„ ํ•˜์…จ๋‹ค๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ์ž˜ํ–ˆ์–ด ๐Ÿ‘

๋‚˜๋Š” ๋˜ํ•œ ์˜ค๋Š˜ ๋ฐค ํ•œ ์ƒ๊ฐ์— ์‚ฌ๋กœ์žกํ˜”๋‹ค. C# LDM๊ณผ ํ†ต์‹ ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด @HaloFour , @gafter ๋˜๋Š” @CyrusNajmabadi ์™€ ๊ฐ™์€ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์™œ ๊ทธ๋“ค์ด ์ทจํ•œ ๊ตฌ๋ฌธ์„ ์ทจํ–ˆ๋Š”์ง€ ๋ฌป๋Š” ๊ฒƒ์€ ์ •๋ง ์ข‹์€ ์ƒ๊ฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ด€์‹ฌ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹จ์ง€ ๊ทธ๊ฒƒ์„ ํ›‘์–ด๋ณธ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŠน์ • ์งˆ๋ฌธ์„ ์š”์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

await ๊ตฌ๋ฌธ๊ณผ ๊ด€๋ จํ•˜์—ฌ(์ด๊ฒƒ์€ ์™„์ „ํžˆ ์–ด๋ฆฌ์„์€ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋‹ด ์—†์ด ์ €์—๊ฒŒ ์†Œ๋ฆฌ๋ฅผ ์ง€๋ฅด์‹ญ์‹œ์˜ค. ์ €๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฉ์ฒญํ•œ ๋†ˆ์ด๊ณ  ์ œ๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค):

"await"๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ? ์™€ ์œ ์‚ฌํ•œ ๊ธฐํ˜ธ/์—ฐ์‚ฐ์ž๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, # ๋˜๋Š” @ ๋˜๋Š” ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ›„์œ„ ์—ฐ์‚ฐ์ž์ธ ๊ฒฝ์šฐ:

let stuff = func()#?;
let chain = blah1()?.blah2()#.blah3()#?;

๋งค์šฐ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋Œ€๊ธฐ( # )ํ•œ ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค( ? ). .await ๊ฐ€ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„์ฒ˜๋Ÿผ ๋ณด์ด๋Š” postfix await ํ‚ค์›Œ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. # ๋Š” ๋ถ„๋ช…ํžˆ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

postfix๊ฐ€ ์ ์ ˆํ•œ ์œ„์น˜์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์šฐ์„  ์ˆœ์œ„ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ๋กœ:

let stuff = #func()?;

์•„๋‹ˆ๋ฉด ๋„๋Œ€์ฒด:

let stuff = func#()?; // :-D :-D

์ด๊ฒƒ์ด ๋…ผ์˜๋œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

(๋‚˜๋Š” ์ด๊ฒƒ์ด Perl์ด ์•…๋ช… ๋†’์€ "๊ธฐํ˜ธ์˜ ๋ฌด์ž‘์œ„ ํ‚ค๋ณด๋“œ ๋งค์‰ฌ" ๊ตฌ๋ฌธ์— ์ ‘๊ทผํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ... :-D )

@rayvector https://github.com/rust-lang/rust/issues/50547#issuecomment -388108875 , ๋‹ค์„ฏ ๋ฒˆ์งธ ๋Œ€์•ˆ.

@CyrusNajmabadi ์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์งˆ๋ฌธ์€ ๋‚˜์—ด๋œ ์˜ต์…˜ ์ค‘์—์„œ ํ˜„์žฌ์˜ Rust ์–ธ์–ด๊ฐ€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋” ์ž˜ ๋งž๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์˜ต์…˜์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ์ฃผ์ œ๋Š” ๊ทธ๋‹ค์ง€ ๊ธธ์ง€ ์•Š์œผ๋ฏ€๋กœ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋น ๋ฅด๊ฒŒ ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์งˆ๋ฌธ: Rust๋Š” ํ˜„์žฌ C#/TS/... await ๋ฐฉ์‹์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ž์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌ๋ฌธ์€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ์ผ์ข…์˜ "๋ ˆ๊ฑฐ์‹œ"์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด C#์— ๊ฐ€์žฅ ์ ํ•ฉํ•˜๊ณ  ์ƒˆ๋กœ ๋“ฑ์žฅํ•˜๋Š” ์–ธ์–ด์—๋„ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์˜ต์…˜์ž…๋‹ˆ๊นŒ?

C# ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ์€ ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„ await foo? ๊ฐ€ ๋จผ์ € ๋Œ€๊ธฐํ•œ ๋‹ค์Œ ? ์—ฐ์‚ฐ์ž๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  C# ์‹คํ–‰์ด ์ฒ˜์Œ await ๊นŒ์ง€ ํ˜ธ์ถœ์ž ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค GetEnumerator ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๋ถ€์ •์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

IEnumerable<int> GetInts(int n)
{
   if (n < 0)
      throw new InvalidArgumentException(nameof(n));
   for (int i = 0; i <= n; i++)
      yield return i;
}

๋‚ด ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ ๊ณผ ์ดํ›„ ํ† ๋ก ์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

@Pzixel ์˜ค,

์–ด์จŒ๋“ , ๋‚˜๋Š” ๊ทธ ์งง์€ ์–ธ๊ธ‰ ์™ธ์—๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋งŽ์€ ํ† ๋ก ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐฌ์„ฑ/๋ฐ˜๋Œ€ํ•˜๋Š” ์ข‹์€ ๋…ผ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@rayvector ๋” ์ž์„ธํ•œ ๊ตฌ๋ฌธ์— ์ฐฌ์„ฑํ•˜์—ฌ ์—ฌ๊ธฐ ์—์„œ ์•ฝ๊ฐ„ ๋…ผ์Ÿํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Perl์ด ์•…๋ช… ๋†’์€ "๊ธฐํ˜ธ์˜ ๋ฌด์ž‘์œ„ ํ‚ค๋ณด๋“œ ๋งค์‰ฌ" ๊ตฌ๋ฌธ

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, await!(f)? ๊ฐ€ ์‹ค์ œ๋กœ ์ตœ์ข… ๊ตฌ๋ฌธ์„ ์œ„ํ•ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ์„ ํƒ์„ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํžˆ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์•„์ง "์‹คํ–‰ ์ค‘"์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ตฌ๋ฌธ( ? ์—ฐ์‚ฐ์ž ํฌํ•จ)์ž…๋‹ˆ๋‹ค.

  • await f?
  • await? f
  • await { f }?
  • await(f)?
  • (await f)?
  • f.await?

๋˜๋Š” ์•„๋งˆ๋„ ์ด๋“ค์˜ ์ผ๋ถ€ ์กฐํ•ฉ. ์š”์ ์€ ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๊ฐ€ ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ด„ํ˜ธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋งŽ์€ ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋„๋Š” await ๊ฐ€ ์ตœ์ข… ๋ฒ„์ „์—์„œ ๋งคํฌ๋กœ๊ฐ€ ์•„๋‹Œ ํ‚ค์›Œ๋“œ ์—ฐ์‚ฐ์ž๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( rpjohnst๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์™ธ).

๋‚˜๋Š” ๊ฐ„๋‹จํ•œ ํ›„์œ„ await ์—ฐ์‚ฐ์ž(์˜ˆ: ~ ) ๋˜๋Š” ๊ด„ํ˜ธ๊ฐ€ ์—†๊ณ  ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ํ‚ค์›Œ๋“œ์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ๊ณ  ์žˆ์—ˆ๊ณ  ๋‹ค์Œ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • await f? ๋Š” ๋จผ์ € ? ์—ฐ์‚ฐ์ž๋ฅผ ํ‰๊ฐ€ํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • (await f)? ๋Š” ๋จผ์ € ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ? ์—ฐ์‚ฐ์ž๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜ Rust ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„๋กœ ์ธํ•ด)
  • await? f ๋Š” `(await f)?์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "๋ฏธ๋ž˜์— ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ"์ด โ€‹โ€‹๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ „์šฉ ๊ตฌ๋ฌธ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” await ๊ฐ€ ๋ช…์‹œ์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๋‹ค๋ฅธ ๋…ผํ‰์ž๋“ค์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. JavaScript์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ํž˜๋“ค๊ณ  Rust ์ฝ”๋“œ์˜ ๋ช…์‹œ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์— ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์‹์„ ์•”์‹œ์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ๋น„๋™๊ธฐ์‹ ์ฝ”๋“œ์—์„œ ์ด ์ž‘์—…์„ ๋ง์น  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"์•”์‹œ์  ๋น„๋™๊ธฐ ๋ธ”๋ก"์€ ๋ฏธ๋ž˜ ์•ž์— await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” proc_macro๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์งˆ๋ฌธ์€ ๋‚˜์—ด๋œ ์˜ต์…˜ ์ค‘์—์„œ ํ˜„์žฌ Rust ์–ธ์–ด๊ฐ€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋” ์ž˜ ๋งž๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์˜ต์…˜์ด ๋ฌด์—‡์ด๋ƒ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Rust ์–ธ์–ด์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ C# ๋””์ž์ด๋„ˆ์—๊ฒŒ ๋ฌป๋Š” ๊ฒƒ์€... ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. :)

๋‚˜๋Š” ๊ทธ๋Ÿฐ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ž๊ฒฉ์ด ์—†๋‹ค๊ณ  ๋Š๋‚€๋‹ค. ๋‚˜๋Š” ๋…น์„ ์ข‹์•„ํ•˜๊ณ  ๊ทธ๊ฒƒ์— ์†์„ ๋Œ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ์ •์‹ ์— ๊นŠ์ด ๋ฟŒ๋ฆฌ๋‚ด๋ฆฐ ์ ๋„ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์—์„œ ์ด ์–ธ์–ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์„ ํƒ์ด ๋ฌด์—‡์ธ์ง€ ์ฃผ์žฅํ•  ์ž๊ฒฉ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go/TypeScript/C#/VB/C++์— ๋Œ€ํ•ด ๋ฌป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ํ›จ์”ฌ ๋” ํŽธ์•ˆํ•˜๊ฒŒ ๋Š๋‚„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋…น์€ ๊ทธ๋Ÿฌํ•œ ์ƒ๊ฐ์— ํŽธ์•ˆํ•จ์„ ๋Š๋ผ๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ „๋ฌธ์ ์ธ ์˜์—ญ์„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

C# ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ์€ ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„ await foo?

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋Š๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 'wait'๋กœ ์šฐ์„ ์ˆœ์œ„์— ๋Œ€ํ•ด ๋งŽ์ด ์ƒ๊ฐํ–ˆ๊ณ  ์›ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋งŽ์€ ํ˜•ํƒœ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์€ ํ•ต์‹ฌ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ์™€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณ ๊ฐ(๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€)์—๊ฒŒ ์‚ฌ๋žŒ๋“ค์ด ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์ดํ›„์— ๋ฌด์—‡์ด๋“  '์—ฐ๊ฒฐ'ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์‚ฌ๋žŒ๋“ค์€ ์™„์ „ํ•œ ํ‘œํ˜„์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ '๊ธฐ๋‹ค๋ฆผ'์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ณ  ๋”ฐ๋ผ์„œ ๊ทธ๊ฒƒ์„ ์ •์ƒ ๊ฐ€๊นŒ์ด์— ๋‘๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ : '์ „์ฒด ํ‘œํ˜„์‹'์ด๋ž€ ํ‘œํ˜„์‹์˜ ๋งจ ์œ„์— ์žˆ๋Š” ํ‘œํ˜„์‹์ด๋‚˜ ์ตœ์ƒ์œ„ ํ• ๋‹น ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ‘œํ˜„์‹ ๋˜๋Š” '์ธ์ˆ˜'๋กœ ์ „๋‹ฌํ•˜๋Š” ํ‘œํ˜„์‹๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด expr ๋‚ด๋ถ€์—์„œ 'await'๋กœ '๊ณ„์†'ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒฝํ–ฅ์€ ๋“œ๋ญ…๋‹ˆ๋‹ค. (await expr).M() ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€๋” ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ await expr.M() ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ๋œ ์ผ๋ฐ˜์ ์ด๊ณ  ๋œ ๋ฐ”๋žŒ์งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ 'await'์— ๋Œ€ํ•œ '์•”์‹œ์ ' ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๊ณ  ์ฝ”๋“œ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ง‘์ค‘ํ•˜์—ฌ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋ช‡ ๋…„์ด ์ง€๋‚œ ํ›„์—๋„ ์ด๋Ÿฌํ•œ ๊ฒฝํ–ฅ์€ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋•Œ๋•Œ๋กœ ์šฐ๋ฆฌ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์žฅํ™ฉํ•œ ๊ฒƒ์„ ์ˆ˜๋…„ ํ›„์— ํ›„ํšŒํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์ดˆ๊ธฐ์—๋Š” ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ข‹์ง€๋งŒ ์ผ๋‹จ ์‚ฌ๋žŒ๋“ค์ด ์ต์ˆ™ํ•ด์ง€๋ฉด ๋” ๊ฐ„๊ฒฐํ•œ ๊ฒƒ์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. '๊ธฐ๋‹ค๋ ค'๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ทธ ํ‚ค์›Œ๋“œ์˜ ๋ฌด๊ฑฐ์šด ์„ฑ๊ฒฉ๊ณผ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •๋ง ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€, ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ๊ณ ๊ฐ์„์œ„ํ•œ ์šฐ์„  ์ˆœ์œ„ ์„ ํƒ์— ๋งค์šฐ ํ–‰๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์—ฌ๊ธฐ์—์„œ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฐ•ํ•œ ์••๋ ฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

--

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ C# ์‹คํ–‰์ด ์ฒ˜์Œ await ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ์ž ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์ง€๋งŒ ์ „ํ˜€ ์‹œ์ž‘๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด์ ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ˜„์žฌ ์ฝ”๋“œ ์กฐ๊ฐ์€ GetEnumerator๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๋ถ€์ •์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

IMO, ์šฐ๋ฆฌ๊ฐ€ ์—ด๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์€ ์•ฝ๊ฐ„์˜ ์‹ค์ˆ˜์˜€์œผ๋ฉฐ ์ˆ˜๋…„ ๋™์•ˆ ๋งŽ์€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝํ–ฅ ๋•Œ๋ฌธ์— ํŠนํžˆ ๋‚˜์ฉ๋‹ˆ๋‹ค.

```c#
๋ฌดํšจ SomeEnumerator(X ์ธ์ˆ˜)
{
// Args์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜ํ™˜ SomeEnumeratorImpl(์ธ์ˆ˜);
}

๋ฌดํšจ SomeEnumeratorImpl(X ์ธ์ˆ˜)
{
// ...
์ƒ์‚ฐํ•˜๋‹ค
// ...
}

People have to write this *all the time* because of the unexpected behavior that the iterator pattern has.  I think we were worried about expensive work happening initially.  However, in practice, that doesn't seem to happen, and people def think about the work as happening when the call happens, and the yields themselves happening when you actually finally start streaming the elements.

Linq (which is the poster child for this feature) needs to do this *everywhere*, this highly diminishing this choice.

For ```await``` i think things are *much* better.  We use 'async/await' a ton ourselves, and i don't think i've ever once said "man... i wish that it wasn't running the code synchronously up to the first 'await'".  It simply makes sense given what the feature is.  The feature is literally "run the code up to await points, then 'yield', then resume once the work you're yielding on completes".  it would be super weird to not have these semantics to me since it is precisely the 'awaits' that are dictating flow, so why would anything be different prior to hitting the first await.

Also... how do things then work if you have something like this:

```c#
async Task FooAsync()
{
    if (cond)
    {
        // only await in method
        await ...
    }
} 

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์™„์ „ํžˆ ํ˜ธ์ถœํ•˜๊ณ  await๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. "๋จผ์ € ๊ธฐ๋‹ค๋ฆด ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ์ž ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ" ์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๊ธฐ๋‹ค๋ฆฌ๋‹ค? f๋Š” `(await f)?์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "๋ฏธ๋ž˜์— ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ"์ด โ€‹โ€‹๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ „์šฉ ๊ตฌ๋ฌธ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€์žฅ ๊ณต๊ฐ์ด ๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Š” 'await'๊ฐ€ ์ตœ์ƒ์œ„ ๊ฐœ๋…์ด ๋˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ ์œ ํ˜•์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

C#์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ง๊ด€์ด ๊ณต๋ฐฑ์— ๋ฌถ์—ฌ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "x๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?" ? ๊ฐ€ ํ‘œํ˜„์‹์— ์ธ์ ‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— await ๊ฐ€ ? ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ๊ฒƒ์ฒ˜๋Ÿผ ์ฆ‰์‹œ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด์šฉ์ด ์‹ค์ œ๋กœ (await x)? ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋˜๋ฉด ์ฒญ์ค‘์ด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

await (x?) ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ๊ตฌ๋ฌธ์—์„œ ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง€๊ณ  ๋ฏธ๋ž˜/์ž‘์—…์˜ '๊ฒฐ๊ณผ'๋ฅผ ๋‹ค์‹œ ์–ป๊ณ  ์‹ค์ œ๋กœ ๊ฐ’์„ ๋ฐ›์€ ๊ฒฝ์šฐ ์ด๋ฅผ '๊ธฐ๋‹ค๋ ค'์•ผ ํ•  ํ•„์š”์„ฑ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. . ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒฐ๊ณผ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด ์ดํ›„์— ๋ฐœ์ƒํ–ˆ์Œ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด 'await'์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ await? x? ๊ฐ ? ๋Š” ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ด€๋ จ๋œ ์ฝ”๋“œ ๋ถ€๋ถ„์— ๋‹จ๋‹จํžˆ ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ? ๋Š” await (ํŠนํžˆ ๊ทธ ๊ฒฐ๊ณผ)์™€ ๊ด€๋ จ๋˜๊ณ  ๋‘ ๋ฒˆ์งธ x ๋ฉ๋‹ˆ๋‹ค.

"๋จผ์ € ๊ธฐ๋‹ค๋ฆด ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ์ž ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ" ์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

ํ˜ธ์ถœ์ž์˜ ๋ฐ˜ํ™˜ ๊ฐ’ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค ๋•Œ๊นŒ์ง€ ์•„๋ฌด๋Ÿฐ ๋ฐ˜์‘์ด ์—†์Šต๋‹ˆ๋‹ค FooAsync ํ•˜๋Š” ํฌ์ธํŠธ, FooAsync ์˜ ๋ชธ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ์–ด๋Š ์ชฝ await ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Rust Future ๋Š” poll ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ ์ดํ›„์— ํด ๊ธฐ๋ฐ˜, ์Šคํƒ ํ• ๋‹น ๋ฐ ์›€์ง์ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๋Š” ์ตœ์ƒ์œ„ Future ์˜ ํž™ ๋˜๋Š” ์ƒ์œ„ Future ๋‚ด๋ถ€์˜ ๊ฐ’์— ๋”ฐ๋ผ ์ข…์ข… "์Šคํƒ ํ”„๋ ˆ์ž„"์— ์žˆ๋Š” ์œ„์น˜๋กœ ์ด๋™ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค Future async fn ํ˜ธ์ถœ ์ค‘ -- ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ a) ํ˜ธ์ถœ ์‹œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” C# ์ƒ์„ฑ๊ธฐ์™€ ์œ ์‚ฌํ•œ ์˜๋ฏธ ์ฒด๊ณ„ ๋˜๋Š” b) ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋„ ์ฆ‰์‹œ ์•”์‹œ์ ์œผ๋กœ ํ•จ์ˆ˜ async { .. } )์— ๊ฐ‡ํ˜€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” C# ์ƒ์„ฑ๊ธฐ์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ณ  ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„ ์งˆ๋ฌธ์„ ์™„์ „ํžˆ ํ”ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›„์ž๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@CyrusNajmabadi Rust์—์„œ Future ์ผ๋ฐ˜์ ์œผ๋กœ Task ๋กœ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(F# Async ์™€ ํ›จ์”ฌ ์œ ์‚ฌํ•จ):

let bar = foo();

์ด ๊ฒฝ์šฐ foo() ๋Š” Future ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(F# Async ์™€ ์œ ์‚ฌํ•จ).

tokio::run(bar);

์ƒ์„ฑ๋˜๋ฉด Future ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Future ์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด๋ฏ€๋กœ Rust์—์„œ async/await๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ์ผ๊ด€๋ฉ๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ C#์—์„œ๋Š” ์ƒํ™ฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. C#์—์„œ๋Š” foo() ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ฆ‰์‹œ Task ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ C#์—์„œ๋Š” ์ฒ˜์Œ await ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. .

๋˜ํ•œ ... ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ [...] ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์™„์ „ํžˆ ํ˜ธ์ถœํ•˜๊ณ  ๋Œ€๊ธฐ๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋จผ์ € ๊ธฐ๋‹ค๋ฆด ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ์ž ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ" ์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

FooAsync() ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  await ๋Š” ์ ˆ๋Œ€ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฆ‰์‹œ () (Rust์˜ void ๋ฒ„์ „)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, "์ฒซ ๋ฒˆ์งธ await ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ์ž ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Œ"์ด ์•„๋‹ˆ๋ผ "๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ(์˜ˆ: tokio::run )"์ž…๋‹ˆ๋‹ค.

ํ˜ธ์ถœ์ž๊ฐ€ FooAsync์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆด ๋•Œ๊นŒ์ง€ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋•Œ FooAsync์˜ ๋ณธ์ฒด๋Š” await ๋˜๋Š” ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ดํฌ. ๋ถˆํ–‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์ข…์ข… ์ทจ์†Œ ๋ฐ ์ž‘์—… ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด) ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๋ชปํ•  ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋กœ์„œ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ดˆ๊ธฐ ์˜ค๋ฅ˜๋ฅผ ์–ป๋Š” ๊ฒƒ์— ๊ฐ์‚ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ๋žŒ๋“ค์ด ๋Œ€๊ธฐ๊นŒ์ง€ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค).

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ a) ํ˜ธ์ถœ ์‹œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” C# ์ƒ์„ฑ๊ธฐ์™€ ์œ ์‚ฌํ•œ ์˜๋ฏธ ์ฒด๊ณ„ ๋˜๋Š” b) ํ•จ์ˆ˜ ํ˜ธ์ถœ๋„ ์ฆ‰์‹œ ์•”์‹œ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” Kotlin ์ฝ”๋ฃจํ‹ด๊ณผ ๊ฐ™์€ ์˜๋ฏธ ์ฒด๊ณ„(ํด๋กœ์ €์™€ ์œ ์‚ฌํ•œ async { ์‚ฌ์šฉ)์— ๊ฐ‡ํ˜€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. . } ๋™์‹œ ์‹คํ–‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๋ธ”๋ก).

์ด๋Ÿฌํ•œ ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‚˜๋Š” ํ›„์ž๋ณด๋‹ค ์ „์ž๋ฅผ ํ›จ์”ฌ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ œ ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์ž…๋‹ˆ๋‹ค. kotlin ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋„๋ฉ”์ธ์— ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง„๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜์„ธ์š”!

@CyrusNajmabadi Ick. ๋ถˆํ–‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์ข…์ข… ์ทจ์†Œ ๋ฐ ์ž‘์—… ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด) ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๋ชปํ•  ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋กœ์„œ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ดˆ๊ธฐ ์˜ค๋ฅ˜๋ฅผ ์–ป๋Š” ๊ฒƒ์— ๊ฐ์‚ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ๋žŒ๋“ค์ด ๋Œ€๊ธฐ๊นŒ์ง€ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค).

๋‚˜๋Š” ์ •๋ฐ˜๋Œ€๋ฅผ ๋Š๋‚€๋‹ค. JavaScript์— ๋Œ€ํ•œ ์ œ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด await ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Promise ๋Š” ๊ณ„์† ์‹คํ–‰๋˜์ง€๋งŒ ์˜ค๋ฅ˜๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค(๋˜๋Š” ๋‹ค๋ฅธ ์ด์ƒํ•œ ์ผ์ด ๋ฐœ์ƒํ•จ).

Rust/Haskell/F# ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด Future ๊ฐ€ ์‹คํ–‰๋˜๊ฑฐ๋‚˜(์˜ฌ๋ฐ”๋ฅธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ํ•จ๊ป˜) ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์Œ์„ ํ™•์ธํ•˜๊ณ  ์กฐ์‚ฌํ•˜๊ณ  ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋” ๊ฐ•๋ ฅํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

@Pauan @rpjohnst ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์šฐ๋ฆฌ๋„ ๊ณ ๋ คํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

"์‹ค์ œ๋กœ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•จ"์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์š”์ฒญ ์‹œ ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ๊น”๋”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ฆ‰ Func<Task> ์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •๋ฐ˜๋Œ€๋ฅผ ๋Š๋‚€๋‹ค. JavaScript์— ๋Œ€ํ•œ ์ œ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

C#์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ž‘์—…์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅ˜๋Š” ์‚ผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์—ด์‹ฌํžˆ ์‹คํ–‰ํ•˜์—ฌ ์ž‘์—…์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋๋‚ด์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์˜ค๋ฅ˜๊ฐ€ ์ฆ‰์‹œ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ˜๋ณต์ž์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๋Š” ๊ฒฝ์šฐ ์ž ์žฌ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ์•„๋ž˜์ชฝ์— ์žˆ๋Š” ํ•จ์ˆ˜์™€ ํ˜ธ์ถœํ•  ๋•Œ์˜ ์‹œ์ ์—์„œ ๋‚ด๊ฐ€ ์ž˜๋ชป ์ƒ์„ฑํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ๋” ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์Œ์„ ํ™•์ธํ•˜๊ณ  ์กฐ์‚ฌํ•˜๊ณ  ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ "์‹คํ–‰ํ•˜์ง€ ์•Š์Œ"์€ ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์‹ค์ œ๋กœ ์ž‘์—…์„ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๋ฒ„๊ทธ๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์‹œ์ ์ด ์•„๋‹ˆ๋ผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ž‘์—…์„ ์ƒ์„ฑํ•œ ์‹œ์ ์— ๊ฐ€๊นŒ์šด ์ง€์ ์—์„œ ์ด์— ๋Œ€ํ•ด ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ชจ๋ธ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์„œ๋กœ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๊ฐ€์„ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ/๋ฐ˜๋ณต์ž์—์„œ๋„ ๋น„์Šทํ•œ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ข…์ข… ๊ทธ๊ฒƒ์„ ๋งŒ๋“ค์ง€๋งŒ ๋‚˜์ค‘์—์•ผ ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์†Œ์Šค๋กœ ๋‹ค์‹œ ์ถ”์ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ถ”๊ฐ€์ ์ธ ๋ถ€๋‹ด์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋งŽ์€ API(hte BCL ํฌํ•จ)๊ฐ€ ๋™๊ธฐ/์ดˆ๊ธฐ ์ž‘์—…๊ณผ ์‹ค์ œ ์ง€์—ฐ/์ง€์—ฐ ์ž‘์—…์„ ๋ถ„ํ• ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์—ด์‹ฌํžˆ ์‹คํ–‰ํ•˜์—ฌ ์ž‘์—…์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋๋‚ด์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์˜ค๋ฅ˜๊ฐ€ ์ฆ‰์‹œ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์—ด๋ง์€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์—์„œ " Future ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋  ๊ฒƒ"์ž…๋‹ˆ๊นŒ?

Future ๊ฐ€ Rust์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ Future ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(async/await ํฌํ•จ, ๋ณ‘๋ ฌ ๊ฒฐํ•ฉ๊ธฐ ๋“ฑ). ๋ชจ๋“  ํ•˜์œ„ Future ๋ฅผ ํฌํ•จํ•˜๋Š” ๋‹จ์ผ ์œตํ•ฉ Future . ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€( main )์—์„œ tokio::run (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์™ธ์— ํ•˜๋‚˜์—์„œ tokio::run ์—์„œ ์ „ํ™” main , ๋‹น์‹ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฐ๋ž€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค Future ๋Œ€์‹  ๋‹จ์ง€๋ฅผ ๊ตฌ์„ฑ, ์ˆ˜๋™์ด์•ผ. ๊ทธ๋ฆฌ๊ณ  ํ•ฉ์„ฑ์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ์„ฑ/์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ/์ทจ์†Œ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋ฅด๊ฒŒ.

๋‚˜๋Š” ๋˜ํ•œ ๋ญ”๊ฐ€๋ฅผ ๋ถ„๋ช…ํžˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ๋•Œ :

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ์–ธ์–ด/ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์•„์ฃผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C#/.Net/CoreFx ๋“ฑ์— ๋Œ€ํ•ด ํ•ฉ๋ฆฌ์ ์ธ ๊ฒฐ์ •์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ๋งŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ๋‹ค๋ฅด๊ณ  ์ตœ์ ํ™”ํ•˜๋ ค๋Š” ๋Œ€์ƒ๊ณผ ์ทจํ•ด์•ผ ํ•˜๋Š” ์ ‘๊ทผ ์œ ํ˜•์ด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉํ–ฅ.

๋‚˜๋Š” ์ดˆ๊ธฐ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์š•๊ตฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์—์„œ "๋ฏธ๋ž˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ฒŒ๋ฉ๋‹ˆ๊นŒ"?

ํ•ญ์ƒ :)

Roslyn(C#/VB ์ปดํŒŒ์ผ๋Ÿฌ/IDE ์ฝ”๋“œ๋ฒ ์ด์Šค) ์ž์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น„๋™๊ธฐ์ ์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ์  ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•ก์„ธ์Šคํ•˜๋Š” ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ์™€ ๊ณต์œ  ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„œ๋น„์Šค๋Š” ํ’๋ถ€ํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ˆ˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ์ž‘์—…์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ์ˆ˜๋งŽ์€ ์ž‘์—… ๊ตฌ์„ฑ ๋ฐ ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ช‡ ms ํ›„์— ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰์กฐ์ฐจ ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ์ˆ˜๋งŽ์€ ์ž‘์—… ๊ตฌ์„ฑ ๋ฐ ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ช‡ ms ํ›„์— ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰์กฐ์ฐจ ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ ์ทจ์†Œ์ฒ˜๋ฆฌ๋งŒ ๋˜๋Š”๊ฑฐ ์•„๋‹˜?

๊ทธ๋ฆฌ๊ณ  ํ•ฉ์„ฑ์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ์„ฑ/์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ/์ทจ์†Œ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋ฅด๊ฒŒ.

๋‹จ์ˆœํžˆ ์‚ฌ๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ฐ€์ง€ ๋งค์šฐ ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์•„์š” :) ์ œ ์„ค๋ช…์€ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๋ชจ๋ธ์˜ ๋งฅ๋ฝ์—์„œ ์ทจํ•ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•˜๋Š” ๋ชจ๋ธ์— ๋งž์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ์‚ฌ๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ฐ€์ง€ ๋งค์šฐ ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์•„์š” :) ์ œ ์„ค๋ช…์€ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๋ชจ๋ธ์˜ ๋งฅ๋ฝ์—์„œ ์ทจํ•ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•˜๋Š” ๋ชจ๋ธ์— ๋งž์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ €๋Š” ๋‹น์‹ ์˜ ๊ด€์ ์„ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ์˜ ๊ด€์ ๋„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๋‚ด์–ด ์„ค๋ช…ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทผ๋ฐ ์ทจ์†Œ์ฒ˜๋ฆฌ๋งŒ ๋˜๋Š”๊ฑฐ ์•„๋‹˜?

์ทจ์†Œ๋Š” ๋น„๋™๊ธฐ์— ๋Œ€ํ•œ ์ง๊ต ๊ฐœ๋…์ž…๋‹ˆ๋‹ค(์ €ํฌ์—๊ฒŒ). ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋Š ์ชฝ๋„ ๋‹ค๋ฅธ ์ชฝ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ์ทจ์†Œํ•˜์ง€ ์•Š๊ณ  ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์„ฑํ•œ ์ž‘์—…์„ '๋Œ€๊ธฐ'ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋…ผ๋ฆฌ์ ์ธ ์ด์œ ๋กœ ์ฝ”๋“œ๊ฐ€ "'t'๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค." (์šฐ๋ฆฌ ์„ธ์ƒ์—์„œ) ์ž‘์—…์— ๋Œ€ํ•œ ์–ด๋–ค ๊ฒƒ๋„ ๊ทธ ์ž‘์—…์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์‹œํ•˜๊ฑฐ๋‚˜ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์กฐ๊ธฐ ๊ฒ€์ฆ์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด๊ฒƒ์€ ๋ฐ˜๋ณต์ž ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ ํ•˜๋ ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ์ธ์ ์ธ ๋ฐ”๋žŒ์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ป์„ ์ˆ˜ ์—†๊ณ  ๋‚ด ํ”„๋กœ๊ทธ๋žจ์ด ์„ฑ๊ณตํ•˜๋”๋ผ๋„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ์ผ์ฐ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‘ ๋ฐฉํ–ฅ ๋ชจ๋‘์— ๋Œ€ํ•ด ํ•ฉ๋ฆฌ์ ์ธ ์ฃผ์žฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์ƒ๊ฐ์€ ๋™๊ธฐ์‹ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹จ์ ๋ณด๋‹ค ์žฅ์ ์ด ๋” ๋งŽ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋™๊ธฐ์‹ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์‹ค์ œ impl์ด ์ž‘๋™ํ•˜๋ ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋งž์ง€ ์•Š์œผ๋ฉด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. D

๋‹ค์‹œ ๋งํ•ด์„œ, ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์—ฌ๊ธฐ์—์„œ ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋ธ์— ๋Œ€ํ•ด ๊ฐ•๋ ฅํ•œ ์ด์ ์ด ์žˆ๋‹ค๋ฉด Rust์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด def๋กœ ์ด๋™ํ•˜์„ธ์š”. :)

์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ์ทจ์†Œํ•˜์ง€ ์•Š๊ณ  ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์„ฑํ•œ ์ž‘์—…์„ '๋Œ€๊ธฐ'ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋…ผ๋ฆฌ์ ์ธ ์ด์œ ๋กœ ์ฝ”๋“œ๊ฐ€ "'t'๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค."

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ if/then/else ๋…ผ๋ฆฌ๋กœ ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

async fn foo() {
    if some_condition {
        await!(bar());
    }
}

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด C#๊ณผ ๋งค์šฐ ๋‹ค๋ฅธ ๊ด€์ ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ if/then/else ๋…ผ๋ฆฌ๋กœ ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ. ์ž‘์—…์ด ์ƒ์„ฑ๋˜๋Š” ๋™์ผํ•œ ์ง€์ ์—์„œ ์กฐ๊ฑด ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋งŽ์€ ๊ฒฝ์šฐ๊ฐ€ ์ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ ์„ธ๊ณ„์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋ฌผ์ด ๊ทธ๋ ‡๊ฒŒ ์ž˜ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์—ด์‹ฌํžˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์ง€๋งŒ(ํ•„์š”ํ•  ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ์ค€๋น„๋˜๋„๋ก) ๋‚˜์ค‘์— ๋” ์ด์ƒ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์˜์—ญ์—์„œ '๊ธฐ๋‹ค๋ฆผ'์€ ์‚ฌ๋žŒ์ด "๊ฐ’์ด ํ•„์š”ํ•œ" ์ง€์ ์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ๊ฒฐ์ •/๊ตฌ์„ฑ์š”์†Œ ๋“ฑ์ž…๋‹ˆ๋‹ค. "๊ฐ€์น˜์— ๋Œ€ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?"์— ๋Œ€ํ•œ ๊ฒฐ์ •์—์„œ

์–ด๋–ค ๋ฉด์—์„œ ์ด๊ฒƒ๋“ค์€ ๋งค์šฐ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ฏธ๋•์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ •์ฑ…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ 'Task'์˜ ๋ฉ‹์ง„ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ ์ค‘์ธ ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•ด ํšจ๊ณผ์ ์œผ๋กœ ์˜์‚ฌ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๋‚˜๋Š” ๋™๊ธฐํ™”/๋น„๋™๊ธฐ ์˜๊ฒฌ์—์„œ ๋ฌผ๋Ÿฌ๋‚˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์—ฌ๊ธฐ์—๋Š” ๋งค์šฐ ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. :)

์šฐ์„  ์ˆœ์œ„ ์ธก๋ฉด์—์„œ ์ €๋Š” C#์ด ์‚ฌ๋ฌผ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์›ํ•˜์‹œ๋ฉด ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@CyrusNajmabadi ์˜ˆ, ๊ท€ํ•˜์˜ ํ†ต์ฐฐ๋ ฅ์ด ๋งค์šฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” await? foo ๊ฐ€ ๊ฐ€์•ผ ํ•  ๊ธธ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ "๋ช…์‹œ์ ์ธ async " ์ œ์•ˆ๋„ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค).

BTW, ๋ชจ๋ธ๋ง ๋น„๋™๊ธฐ/๋™๊ธฐํ™” ์ž‘์—…๊ณผ ํ•ด๋‹น ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ์žฅ๋‹จ์ ์— ๋Œ€ํ•œ .net ๋ชจ๋ธ์˜ ๋ชจ๋“  ๋ณต์žก์„ฑ์— ๋Œ€ํ•œ ์ตœ๊ณ ์˜ ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์›ํ•˜์‹ ๋‹ค๋ฉด @stephentoub ๊ฐ€ ๋Œ€ํ™”

๋‚ด ๊ธฐ์–ต์œผ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๋ถ„ํ• ์— ๋Œ€ํ•œ ๋น„์Šทํ•œ ์ƒ๊ฐ์ด ์ดˆ๊ธฐ์— .net์˜ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋ฐ˜์˜๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ๊ฐ€ ๋‚ด๋ฆฐ ๊ถ๊ทน์ ์ธ ๊ฒฐ์ •๊ณผ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ ์ ˆํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•„์ฃผ ์ž˜ ๋งํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋‚ฏ์„ค๋”๋ผ๋„ await? future ์— ์ฐฌ์„ฑ ํˆฌํ‘œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‹ค์งˆ์ ์ธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์ฝœ๋“œ(F#)์™€ ํ•ซ(C#, JS) ๋น„๋™๊ธฐ์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ฒ ์ €ํ•œ ๋ถ„์„์ž…๋‹ˆ๋‹ค. http://tomasp.net/blog/async-csharp-differences.aspx

์ด์ œ ์ „์šฉ ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ ์—†์ด ์ ‘๋ฏธ์‚ฌ await ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ์šฉ ์ƒˆ๋กœ์šด RFC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/rust-lang/rfcs/pull/2442

await {} ๋Š” ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ unsafe {} ์—ฐ์ƒ์ผ€ ํ•˜๋ฉฐ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

let value = await { future }?;

@seunlanlege
์˜ˆ, ์—ฐ์ƒ์‹œํ‚ค๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ž˜๋ชป๋œ ๊ฐ€์ •์„ ํ•ฉ๋‹ˆ๋‹ค.

let value = await {
   let val1 = future1;
   future2(val1)
}

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@Pzixel
๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์‚ฌ๋žŒ๋“ค์ด await {} ๋ธ”๋ก ๋‚ด์—์„œ ์„ ๋ฌผ์ด ์•”์‹œ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. await {} ๋Š” ๋ธ”๋ก์ด ํ‰๊ฐ€ํ•  ํ‘œํ˜„์‹์—์„œ๋งŒ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

let value = await {
    let future = create_future();
    future
};

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚™๋‹ดํ•˜๋Š” ํŒจํ„ด์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค

์‰ฝ๊ฒŒ ํ•œ

let value = await { create_future() };

๋‘ ๊ฐœ ์ด์ƒ์˜ ํ‘œํ˜„์ด "๊ถŒ์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค"๋Š” ์ง„์ˆ ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

await ๋ฅผ ํŒจํ„ด์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๊นŒ( ref ๋“ฑ ์ œ์™ธ)?
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ:

let await n = bar();

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ await ๋ณด๋‹ค async ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ, ํŒจํ„ด ๊ตฌ๋ฌธ์œผ๋กœ ๋งŒ๋“œ๋Š” ์ด์ ์€ ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค. ํŒจํ„ด ๊ตฌ๋ฌธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๋‹น ํ‘œํ˜„์‹๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด์ค‘์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

https://doc.rust-lang.org/nightly/std/task/index.html ์˜ ํ˜„์žฌ ํŽ˜์ด์ง€์— ๋”ฐ๋ฅด๋ฉด ์ž‘์—… ๋ชจ๋“œ๋Š” libcore์—์„œ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๊ธฐ์™€ liballoc์—์„œ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๊ธฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ ์•ฝ๊ฐ„ ... ์ฐจ์„ ์ฑ…. ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • [x] UnsafePoll ํŠธ๋ ˆ์ž‡๊ณผ Poll ์—ด๊ฑฐํ˜•์€ ์ด๋ฆ„์ด ๋งค์šฐ ๋น„์Šทํ•˜์ง€๋งŒ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค UnsafePoll ๋กœ, ์˜ˆ๋ฅผ UnsafeTask .
  • [x] ์„ ๋ฌผ ์ƒ์ž์—์„œ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ํ•˜์œ„ ๋ชจ๋“ˆ๋กœ ๋ถ„ํ• ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” task.rs ํ•จ๊ป˜ ๋ฌถ์—ฌ ํƒ์ƒ‰ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • [x] TaskObj#from_poll_task() ์— ์ด์ƒํ•œ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ new() ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • [x] TaskObj#poll_task ๋Š” poll() ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ๋ผ๋Š” poll ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ poll_fn ๋˜ํ•œ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์˜ ์ œ์•ˆ ๊ฒƒ์ด๋‹ค
  • Waker ๋Š” TaskObj ์™€ ๋™์ผํ•œ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๊ณ  vtable์„ ์Šคํƒ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์›ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ„์ ‘์ ์ธ ์˜ํ–ฅ์ด ์กฐ๊ธˆ ๋” ์ ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฅด์ง€ ์•Š์„๊นŒ์š”?
  • [ ] dyn ๋Š” ์ด์ œ ๋ฒ ํƒ€์—์„œ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์ ์šฉ๋˜๋Š” ๊ณณ์— dyn ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌผ๊ฑด์— ๋Œ€ํ•œ PR๋„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @cramertj @aturon ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋…ผ์˜ํ•˜๋ ค๋ฉด Discord๋ฅผ ํ†ตํ•ด ์ €์—๊ฒŒ ์—ฐ๋ฝํ•ด ์ฃผ์„ธ์š”.

๋ชจ๋“  Future ๋Œ€ํ•ด await() ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

    /// just like and_then method
    let x = f.and_then(....);
    let x = f.await();

    await f?     =>   f()?.await()
    await? f     =>   f().await()?

/// with chain invoke.
let x = first().await().second().await()?.third().await()?
let x = first().await()?.second().await()?.third().await()?
let x = first()?.await()?.second().await()?.third().await()?

@zengsai ๋ฌธ์ œ๋Š” await ๊ฐ€ ์ผ๋ฐ˜ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค async ๋ธ”๋ก/ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ ๋•Œ await ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋ฉ”์†Œ๋“œ๋Š” ์–ด๋–ค ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@xfix ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์›ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ํŠน๋ณ„ํžˆ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์Šคํƒ€์ผ ํ˜ธ์ถœ์€ ๊ธฐ๋ณธ ์„ค์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ(๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” await๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ) ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ถ”์•…ํ•œ ํ•ดํ‚น์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@elszben ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜ํ–‰ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

future.await() ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ€๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„์—์„œ ์ œ์•ˆํ•œ future.await!() ๊ตฌ๋ฌธ์ด ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ๋งคํฌ๋กœ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๊ฒŒ์‹œ๋ฌผ์ด ์‚ญ์ œ๋จ

์ด ๊ฒŒ์‹œ๋ฌผ์„ future RFC๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋งํฌ

async fn ์™€ #[must_use] ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

async fn ๊ฒฝ์šฐ ์ด๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  Future ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  async fn ์—๋Š” "์™ธ๋ถ€" impl Future ์œ ํ˜•์— ๊ณ ์œ ํ•œ #[must_use] ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ Future ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜์ง€ ์•Š๊ณ ๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

๊ทธ ์œ„์—, ๋‹น์‹ ์ด ๊ฒฝ์šฐ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค #[must_use] ๋ฐ›๋Š” async fn ์ฆ‰ ๋‚ด๋ถ€ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜์— ์ ์šฉํ•ด์•ผ์ฒ˜๋Ÿผ ์ž์‹ ์ด ๋ณด์ธ๋‹ค. ๋”ฐ๋ผ์„œ #[must_use] async fn foo() -> T { ... } ์ž‘์„ฑํ•˜๋ฉด await ๊ฒฐ๊ณผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜์ง€ ์•Š๊ณ ๋Š” await!(foo()) ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

async fn๊ณผ #[must_use] ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํ† ๋ก ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ https://github.com/rust-lang/rust/issues/51560์„ ์ฐธ์กฐ

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ ์žฌ๊ท€ ๋˜๋Š” ์ƒํ˜ธ ์žฌ๊ท€๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

await ๊ตฌ๋ฌธ์˜ ๊ฒฝ์šฐ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌํ›„ ์ˆ˜์ • ๋งคํฌ๋กœ๋ฅผ ์„ ํ˜ธํ•˜๊ณ  ์•”์‹œ์  ๋Œ€๊ธฐ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์—†์œผ๋ฉฐ ์—ฐ๊ฒฐ์ด ์‰ฝ๊ณ  ์ผ์ข…์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@warlord500 ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ๋ฐœ์ž์˜ ์ „์ฒด await ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Pzixel ๋‚ด๊ฐ€ ์Šค๋ ˆ๋“œ๋‚˜ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ฝ์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์ผ๋ถ€ ๊ธฐ์—ฌ์ž๊ฐ€ ์—ฐ๊ฒฐ ๋Œ€๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ ์ค‘ ์ผ๋ถ€๋Š”
ํ•˜๋Š” ๊ฐœ๋ฐœ์ž. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด๊ฐ€ ๋ฌด์‹œํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฐœ๋…์„ ์–ด๋””์„œ ์–ป์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž ์˜๊ฒฌ, ๋‚ด ์˜๊ฒฌ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›์˜ ์˜๊ฒฌ๊ณผ ๊ทธ ์˜๊ฒฌ์„ ์œ ์ง€ํ•˜๋Š” ์ด์œ ๋ฅผ ์ง€์ •ํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์˜๊ฒฌ์ด ๋‹ค๋ฅด๋ฉด ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค! ๋งํ•˜๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค
๊ตฌ๋ฌธ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์—ฐ๊ฒฐ ๋Œ€๊ธฐ๋ฅผ ํ—ˆ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๊นŒ?

@warlord500์€ MS ํŒ€์ด ์ˆ˜์ฒœ ๋ช…์˜ ๊ณ ๊ฐ๊ณผ ์ˆ˜๋ฐฑ๋งŒ ๋ช…์˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฒฝํ—˜์„ ๊ณต์œ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์ผ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์„ ์Šค์Šค๋กœ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ •ํ™•ํ•œ ๊ฒฌ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” 'wait'๋กœ ์šฐ์„ ์ˆœ์œ„์— ๋Œ€ํ•ด ๋งŽ์ด ์ƒ๊ฐํ–ˆ๊ณ  ์›ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋งŽ์€ ํ˜•ํƒœ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์€ ํ•ต์‹ฌ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ์™€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณ ๊ฐ(๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€)์—๊ฒŒ ์‚ฌ๋žŒ๋“ค์ด ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์ดํ›„์— ๋ฌด์—‡์ด๋“  '์—ฐ๊ฒฐ'ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์‚ฌ๋žŒ๋“ค์€ ์™„์ „ํ•œ ํ‘œํ˜„์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ '๊ธฐ๋‹ค๋ฆผ'์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ณ  ๋”ฐ๋ผ์„œ ๊ทธ๊ฒƒ์„ ์ •์ƒ ๊ฐ€๊นŒ์ด์— ๋‘๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ : '์ „์ฒด ํ‘œํ˜„์‹'์ด๋ž€ ํ‘œํ˜„์‹์˜ ๋งจ ์œ„์— ์žˆ๋Š” ํ‘œํ˜„์‹์ด๋‚˜ ์ตœ์ƒ์œ„ ํ• ๋‹น ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ‘œํ˜„์‹ ๋˜๋Š” '์ธ์ˆ˜'๋กœ ์ „๋‹ฌํ•˜๋Š” ํ‘œํ˜„์‹๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด expr ๋‚ด๋ถ€์—์„œ 'await'๋กœ '๊ณ„์†'ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒฝํ–ฅ์€ ๋“œ๋ญ…๋‹ˆ๋‹ค. (await expr).M() ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€๋” ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ await expr.M() ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ๋œ ์ผ๋ฐ˜์ ์ด๊ณ  ๋œ ๋ฐ”๋žŒ์งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฝ๋‹ค. ๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— post-fix easy chain ์Šคํƒ€์ผ์„ ๊ธฐ๋‹ค๋ฆฌ์‹ญ๋‹ˆ๊นŒ? await๋Š” ํ‘œํ˜„์‹์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ์—๋งŒ ๊ท€ํ•˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ๋ฐ”๋กœ์žก์•„์ฃผ์„ธ์š”.

๋˜ํ•œ ๊ฒฌ์ ์„ ๋ฐ›์€ ๊ณณ์˜ ๋งํฌ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”.

์œ„์˜ ๋‘ ๊ฐ€์ง€ ์š”์ ์— ๋Œ€ํ•œ ์ œ ๋ฐ˜๋Œ€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ฝ”๋“œ๋ฅผ ๋” ๊นจ๋—ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— ํ•ด๋กญ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋ฏธ๋ž˜ ์ƒ์„ฑ ํ‘œํ˜„์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ํ‘œํ˜„์‹์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ inst ๋Œ€๊ธฐ
๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๊ณ  ๋งจ ์œ„์— ๋†“๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ๋งคํฌ๋กœ ์Šคํƒ€์ผ ์™ธ์— ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์Šคํƒ€์ผ์„ ํ—ˆ์šฉํ•˜๋ฉด ์—ฌ์ „ํžˆ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฒฌ์ ์„ ๋ฐ›์€ ๊ณณ์˜ ๋งํฌ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”.

ํ•˜์ง€๋งŒ... ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๋‹น์‹ ์ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค... ๐Ÿ˜ƒ

ํ•˜์ง€๋งŒ ๊ณต์œ ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค: https://github.com/rust-lang/rust/issues/50547#issuecomment -388939886 . ๋ชจ๋“  Cyrus ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์œผ์‹ค ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ ์ „์ฒด C#/.Net ์ƒํƒœ๊ณ„์˜ ๊ฒฝํ—˜์ด๋ฉฐ Rust์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ท€์ค‘ํ•œ ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค.

๋•Œ๋กœ๋Š” ํ‘œํ˜„์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค

์ธ์šฉ๋ฌธ์€ ๋ถ„๋ช…ํžˆ ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

async/await์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿผ ๊ณต์œ  ๋ถ€ํƒ๋“œ๋ ค๋„ ๋ ๊นŒ์š”?

์™€์šฐ, ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๋†“์ณค๋‹ค๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋งํฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ฒฝํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๊ณ„ํš์—์„œ ๋‚ด ์˜๊ฒฌ์€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Pzixel async / await ์‚ฌ์šฉํ•˜์—ฌ ๊ท€ํ•˜์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝํ—˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ธฐ์—ฌ์ž๋“ค์„ ์กด์ค‘ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ์ž์‹ ์˜ ๊ธฐ์ˆ ์  ์š”์ ์„ ๋“ฃ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ฒฝํ—˜ ์ˆ˜์ค€์„ ๋น„ํŒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ค‘์žฌ์ž ์ฐธ๊ณ  ์‚ฌํ•ญ: @Pzixel ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•œ ์ ˆ๋Œ€ ๋‹ค์‹œ ํ•˜์ง€๋งˆ. ์ค‘์žฌ ์ •์ฑ…์— ๋Œ€ํ•ด ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ [email protected] ๋กœ

@crabtw ๋‚˜๋Š” ๋ˆ„๊ตฌ๋ฅผ ๋น„ํŒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ถˆํŽธ์„ ๋ผ์ณ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ๋žŒ์ด '๊ธฐ๋‹ค๋ฆผ'์„ ์‹ค์ œ๋กœ ํ•„์š”๋กœ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์œ„์— ํ˜ธ์†Œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. "์ง์ ‘ ์‹œ๋„ํ•ด๋ณด๊ณ  ์ด ์ง„์‹ค์„ ์Šค์Šค๋กœ ๊นจ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ์ •๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณต๊ฒฉ์ ์ธ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ ํšŒ์›์— ๋Œ€ํ•œ ์ธ์‹ ๊ณต๊ฒฉ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹˜์˜ ๋Œ“๊ธ€์—์„œ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ธ์‹ ๊ณต๊ฒฉ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‹น์‹ ์€ downvotes์— ๋Œ€ํ•œ ๋‚ด ์ฐธ์กฐ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ๋‚ด ๊ฒŒ์‹œ๋ฌผ downvote์— ๋Œ€ํ•œ ๋‚ด ์›์ž๋กœ์˜€์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋„ ํ•ฉ๋ฆฌ์ ์ด๋ฏ€๋กœ(์ถ”๊ฐ€ ๋…์ž์—๊ฒŒ๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Œ) ์ œ๊ฑฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด๊ฐ€ ๋งํ•˜๋Š” '๋ณต์Œ'์„ ๋ฐ›์•„๋“ค์—ฌ์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. :) Rust์™€ C#์€ ๋‹ค๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ, ํŒจ๋Ÿฌ๋‹ค์ž„, ๊ด€์šฉ๊ตฌ๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์–ธ์–ด์— ๋Œ€ํ•ด ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋ง์ด ๋„์›€์ด ๋˜๊ณ  ํ†ต์ฐฐ๋ ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํฌ๋ง์€ ๋‹น์‹ ์ด Rust๋ฅผ ์œ„ํ•ด ๋†€๋ผ์šด ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด ๋ฌด์Šจ ์ง“์„ํ–ˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๊บผ์ด C #์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์ฑ„ํƒ ํ›”์น˜๋Š” :)

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ, ์—ฐ๊ฒฐ๋œ ์ธ์ˆ˜๋Š” ์ฃผ๋กœ await ์˜ ์šฐ์„  ์ˆœ์œ„ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ํŠนํžˆ await x.y() ๋ฅผ await (x.y()) ๋ณด๋‹ค๋Š” (await x).y() ์‚ฌ์šฉ์ž๊ฐ€ ์ „์ž์˜ ํ•ด์„์„ ๋” ์ž์ฃผ ์›ํ•˜๊ณ  ๊ธฐ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— await!(x.y()) ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์ด ๋ชจํ˜ธ์„ฑ์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ์ ์„ ๊ด€์ฐฐํ–ˆ์ง€๋งŒ ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ x.y().await!().z() ์™€ ๊ฐ™์€ ์—ฐ๊ฒฐ์˜ ๊ฐ€์น˜์™€ ๊ด€๋ จํ•˜์—ฌ ํŠน์ • ๋‹ต๋ณ€์„ ์ œ์•ˆํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธ์šฉ๋œ ์ฃผ์„์€ ๋ถ€๋ถ„์ ์œผ๋กœ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. Rust์—๋Š” ์ตœ์ข… await ๊ตฌ๋ฌธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ํฐ ์š”์ธ ์ค‘ ํ•˜๋‚˜์ธ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. C#์—๋Š” ? ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (await expr)? ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ (await expr).M() ๋ฅผ ์ •๋ง ๋“œ๋ฌธ ๊ฒƒ์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ , ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Rust์—์„œ๋„ ์‚ฌ์‹ค์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ, ๋‚ด ๊ด€์ ์—์„œ ์œ ์ผํ•œ ์˜ˆ์™ธ๋Š” ? ์ด๋ฉฐ, ์ด๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ฏธ๋ž˜๊ฐ€ ๊ฒฐ๊ณผ๋กœ ํ‰๊ฐ€๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์„ ๋ฌผ์ด ๊ฒฐ๊ณผ๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค).

@withoutboats ๋„ค ๋งž์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ธ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ์œ ์ผํ•œ ์˜ˆ์™ธ๋Š” ?

์œ ์ผํ•œ ์˜ˆ์™ธ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๋•Œ๋Š” ๋งŒ๋“ค ํƒ€๋‹น await? foo A์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ (await foo)? ์™€ ๋‘ ์„ธ๊ณ„์˜ ์ตœ๊ณ ๋ฅผ ๊ฐ€์ง„.

์ง€๊ธˆ, ์ตœ์†Œํ•œ์˜ ์ œ์•ˆ ๊ตฌ๋ฌธ await!() ์˜ ๋ช…ํ™•ํ•œ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ? . await ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ await ๋ฐ ? ์กฐํ•ฉ์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋” ์งง์€ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ ๋‚ด์šฉ์— ๋”ฐ๋ผ, ์šฐ๋ฆฌ๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

@joshtriplett ์ด ์ถ”๊ฐ€ ์ค‘๊ด„ํ˜ธ๋Š” ๋ชจํ˜ธ์„ฑ์„ ์ œ๊ฑฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค. ์˜ˆ: ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ๊ฒ€์ƒ‰:

Matching lines: 139 Matching files: 10 Total files searched: 77

2743 sloc์— 139๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๊ฑฐ ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ธŒ๋ ˆ์ด์Šค๊ฐ€ ์—†๋Š” ๋Œ€์•ˆ์„ ๋” ๊นจ๋—ํ•˜๊ณ  ๋” ๋‚˜์€ ๋Œ€์•ˆ์œผ๋กœ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ? ๋Š” ์œ ์ผํ•œ ์˜ˆ์™ธ์ด๋ฏ€๋กœ ์ค‘๊ด„ํ˜ธ ์—†์ด ์‰ฝ๊ฒŒ await foo ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ LISP ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ์ผ๋ถ€ ์ค‘๊ด„ํ˜ธ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์„œ๋ช…์— ๋Œ€ํ•ด ์™ธ๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋…์„œ๋ฅผ ์ฆ๊ธฐ์‹ญ์‹œ์˜ค!

https://github.com/MajorBreakfast/rust-blog/blob/master/posts/2018-06-19-outer-return-type-approach.md

๋‚˜๋Š” ๋ชจ๋“  ํ† ๋ก ์„ ๋”ฐ๋ฅด์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ๋‚ด๊ฐ€ ๋†“์ณค๋‹ค๋ฉด ์ด๋ฏธ ๋…ผ์˜๋˜์—ˆ์„ ์œ„์น˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ง€์ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๋‹ค์Œ์€ ๋‚ด๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. Stream ๊ตฌ๋ฌธ์ด ์ง€์ •๋  ๋•Œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์„๊นŒ์š”? async fn foo() -> impl Stream<Item = T> ์€ async fn foo() -> impl Future<Output = T> ์™€ ์ผ์น˜ํ•˜๊ณ  ๋ฉ‹์ง€๊ฒŒ ๋ณด์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚ด๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  async_stream ํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Ekleog Stream์€ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. impl Trait ๋Š” ๋ฐ˜๋Œ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— async ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŠน์ • ํŠน์„ฑ๋งŒ ๊ตฌํ˜„๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน์„ฑ ์ž์ฒด๋Š” ๊ธฐ๋ณธ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์—์„œ ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์™ธ๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์€ ์–ธ์  ๊ฐ€ ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async_gen fn foo() -> impl AsyncGenerator<Yield = i32, Return = ()> { yield 1; ... }

Stream ๋Š” Return = () ํ•˜์—ฌ ๋ชจ๋“  ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async_gen fn foo() -> impl Stream<Item = i32> { yield 1;  ... }

์ฐธ๊ณ : Generator๋Š” ์ด๋ฏธ nightly์— ์žˆ์ง€๋งŒ ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ ๋ฌผ 0.3์˜ Stream ์™€ ๋‹ฌ๋ฆฌ ํ˜„์žฌ ๊ณ ์ • ์ธ์‹ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด ์ฝ”๋“œ๋Š” ์ด์ „์— Generator . Stream ์™€ Generator ์˜ ์ฐจ์ด๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์€ ๋น„๋™๊ธฐ์‹์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋“ค์ด ๊ฐ’์„ ์‚ฐ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Poll::Ready ๋˜๋Š” Poll::Pending ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Generator ๋Š” ํ•ญ์ƒ ๋™์‹œ์— ์–‘๋ณดํ•˜๊ฑฐ๋‚˜ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ œ AsyncGenerator ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

Edit2: @Ekleog ํ˜„์žฌ ๊ตฌํ˜„๋œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ๋งˆ์ปค๊ฐ€ ์—†๋Š” ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ณธ๋ฌธ ๋‚ด๋ถ€์—์„œ yield ๋ฅผ ์ฐพ์•„ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์—ฌ์•ผ ํ•จ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ async ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์˜ณ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•ฉ๋ฆฌ์ ์ธ์ง€๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋‹ค๋ฅธ ์ฃผ์ œ๋ฅผ ์œ„ํ•œ ๊ฒƒ ๊ฐ™์•„์š”^^'

์‹ค์ œ๋กœ, ๋‚˜๋Š” async ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, async ๊ฐ€ ์ด RFC์— ๋”ฐ๋ผ Future s์—์„œ๋งŒ ํ—ˆ์šฉ๋˜๊ณ  ๋”ฐ๋ผ์„œ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ Stream ๋ฐ˜ํ™˜ ํ˜•์‹์„ ๋ณด๋ฉด (์ˆ˜ ์žˆ์–ด์•ผํ•˜๋Š” ์ค‘ ํ•˜๋‚˜ Future ๋˜๋Š” Stream ).

์šฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ฐ–๊ณ  ์‹ถ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜๊ณ ์žˆ์–ด ์ด์œ ๋Š” async ์ƒ์„ฑํ•˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ชจ๋‘ Future s์™€ Stream ์˜, ๊ทธ๋•Œ ๋‚ด๊ฐ€ ์™ธ๋ถ€ ๋ฐ˜ํ™˜ ์ƒ๊ฐ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ช…์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๊นจ๋—ํ•  ๊ฒƒ์ด๋ฉฐ async fn foo() -> i32 ๊ฐ€ i32 ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ณธ๋ฌธ์— yield ๋ฐ ๋‚ด๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์ด ์„ ํƒ๋จ).

์ œ๋„ˆ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ํ‚ค์›Œ๋“œ(์˜ˆ: gen fn )๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๋‘˜ ๋‹ค ์ ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: async gen fn ). ์™ธ๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ ์—ฌ๊ธฐ์— ์˜ฌ ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.

@rpjohnst ์™ธ๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ๊ด€๋ จ ์œ ํ˜•์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์„ ์„ค์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Stream์€ impl Iterator<Item=impl Future>> ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ์ „ํžˆ ๋‹จ์ผ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

@rpjohnst ์—ฐ๊ด€ ์œ ํ˜• Yield ๋ฐ Return (๋น„๋™๊ธฐ) ์ƒ์„ฑ๊ธฐ๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

gen fn foo() -> impl Generator<Yield = i32, Return = ()> { ... }

์ด๊ฒƒ์€ ์ œ ์›๋ž˜ ์Šค์ผ€์น˜์˜€์ง€๋งŒ ์ ์–ด๋„ ์ถ”์  ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์•ž์„œ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// generator
fn foo() -> T yields Y

// generator that implements Iterator
fn foo() yields Y

// async generator
async fn foo() -> T yields Y

// async generator that implements Stream
async fn foo() yields Y

๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ RFC์—์„œ ๋‚ด๋ฆฐ ๊ฒฐ์ •์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜๊ธฐ ์ „์— ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ๊ฒฝํ—˜์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ฃผ์žฅ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๊ฐ€์ค‘์น˜๊ฐ€ ํ•„์š”ํ•œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด RFC์—์„œ ์ œ์•ˆํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ์œผ๋ฉด async/await ๊ตฌ๋ฌธ์˜ ์•ˆ์ •ํ™”๊ฐ€ ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๊ตฌ๋ฌธ ๋ฐ ๊ตฌํ˜„์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์ด ๋‘ ๊ฐ€์ง€์— ๋Œ€ํ•œ ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์„๊นŒ์š”? (์•ˆ์ •ํ™”๋˜๋ฉด ์™ธ๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜•๊ณผ ๋‚ด๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ๊ฐ„์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—)

๋‚˜๋Š” async/await๊ฐ€ Rust 2018์—์„œ ์˜ˆ์ƒ๋˜๊ณ  ๊ทธ๋•Œ๊นŒ์ง€ ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์ค€๋น„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒโ€ฆ?

(๋˜ํ•œ ๋‚ด ์˜๊ฒฌ์€ @MajorBreakfast ์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฃผ์žฅ์œผ๋กœ๋งŒ ์˜๋„๋˜์—ˆ์ง€๋งŒ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์™„์ „ํžˆ ์ง€์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... ๊ทธ๊ฑด ๋‚ด ๋ชฉํ‘œ๊ฐ€ ์•„๋‹ˆ์—ˆ๊ณ  ํ† ๋ก ์ด ๋‹ค์‹œ ์ดˆ์ ์„ ๋งž์ถฐ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ?)

await ํ‚ค์›Œ๋“œ์˜ ์ข์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์—ฌ์ „ํžˆ ๋‚˜๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. (ํŠนํžˆ ๋ฏธ๋ž˜ ๋Œ€ ์ŠคํŠธ๋ฆผ ๋Œ€ ์ƒ์„ฑ๊ธฐ)

๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์— yield ํ‚ค์›Œ๋“œ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์—์„œ์™€ ๊ฐ™์ด

{ let a = yield future; println(a) } -> Future

์ด๋Š” ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๋ช…์‹œ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฏ€๋กœ ํ‚ค์›Œ๋“œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„ˆ๋ฌด ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  "์—ฐ์†" ๊ธฐ๋ฐ˜ ์˜๋ฏธ๋ก ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ํ‚ค์›Œ๋“œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

(์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํด๋ ˆ์ด ์–ธ์–ด๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค btw)

@aep await ๋Š” ์ƒ์„ฑ๊ธฐ์—์„œ ๋ฏธ๋ž˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Future ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ํ˜ธ์ถœ์ž์—๊ฒŒ ์ œ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

@cramertj ๊ธ€์Ž„, ํ›จ์”ฌ ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ธ tho(yield ํ‚ค์›Œ๋“œ ๋’ค์— ์—ฐ์†์„ ํฌํ•จํ•˜๋Š” future๋ฅผ ๋ฐ˜ํ™˜)๋ฅผ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๊ทธ ํ† ๋ก  ํŒŒํ‹ฐ์— ์กฐ๊ธˆ ๋Šฆ์—ˆ๋‚˜์š”? :)

@aep await ํŠน์ • ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ์ถ”๋ก ์€ ๋ฏธ๋ž˜์˜ ์ƒ์„ฑ๊ธฐ๋ณ„ yield ํ‚ค์›Œ๋“œ์™€์˜ ์กฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ์ด๋Š” ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์—ฐ์† "๋ฒ”์œ„"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, Rust ์„ ๋ฌผ์€ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ํด ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์†์„ ํฌํ•จํ•˜๋Š” ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ด์œ  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. poll ๊ฐ€ ๋‹จ์ผ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด yield ๊ฐ€ ์ฐธ์กฐ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

async/await๋Š” ์–ธ์–ด ์ž์ฒด๋ฅผ ์˜ค์—ผ์‹œํ‚ค๋Š” ํ‚ค์›Œ๋“œ ์›์ธ์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด async๋Š” ์–ธ์–ด์˜ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@sackery ์–ธ์–ด ๋‚ด๋ถ€์˜ ์ผ๋ถ€์ด๋ฉฐ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ nim์ฒ˜๋Ÿผ ํ‚ค์›Œ๋“œ๋กœ ๋งŒ๋“œ์„ธ์š”, C#์€ ๊ทธ๋ ‡์ฃ !

์งˆ๋ฌธ: ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๋กœ ๊ฐ’์„ ์บก์ฒ˜ํ•˜๋Š” async non-move ํด๋กœ์ €์˜ ์„œ๋ช…์€ ๋ฌด์—‡์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํ˜„์žฌ ๊ทธ๋“ค์€ ์™„์ „ํžˆ ๊ธˆ์ง€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋กœ์ € ์ฐจ์šฉ์ด ๋ฏธ๋ž˜๊ฐ€ ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ์ง€์†๋˜๋„๋ก ํ•˜๋Š” ์ผ์ข…์˜ GAT ์ ‘๊ทผ ๋ฐฉ์‹์„ ์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ:

trait AsyncFnMut {
    type Output<'a>: Future;
    fn call(&'a mut self, args: ...) -> Self::Output<'a>;
}

@cramertj ํด๋กœ์ €์˜ ์บก์ฒ˜๋œ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์ด async fn์— ์—ฐ๊ฒฐ๋  ํ•„์š”๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ?

@withoutboats ๋งž์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ๋ณด๋‹ค async ์ƒํ™ฉ์—์„œ ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์•ฝ fn async ๋Œ€์‹  async fn ?
๊ฐ™์€ I let mut ๋ณด๋‹ค mut let .

fn foo1() {
}
fn async foo2() {
}
pub fn foo3() {
}
pub fn async foo4() {
}

pub fn ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์—ฌ์ „ํžˆ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋ชจ๋“  ๊ณต๊ฐœ ๊ธฐ๋Šฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๊ตฌ๋ฌธ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

fn foo1() {
}
async fn foo2() {
}
pub fn foo3() {
}
pub async fn foo4() {
}

์ด ์ œ์•ˆ์€ ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹  ๋ชจ๋‘์˜ ์˜๊ฒฌ์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค :)

๋ชจ๋“  ์ˆ˜์‹์–ด๊ฐ€ fn ์•ž์— ์™€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์ƒ์‹์ž…๋‹ˆ๋‹ค.

@Pzixel ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ก์„ธ์Šค ์ˆ˜์ •์ž๊ฐ€ fn ์•ž์— ์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ async ๋Š” ์•„๋งˆ ์•„๋‹ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@xmeta ์ด์ „์— ์ œ์•ˆ๋œ ์ด ์•„์ด๋””์–ด๋ฅผ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด async ๋ฅผ fn ์•ž์— ๋†“๊ณ  ์‹ถ์ง€๋งŒ ๋ชจ๋“  ์˜ต์…˜์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

// Status quo:
pub unsafe async fn foo() {} // #![feature(async_await, futures_api)]
pub const unsafe fn foo2() {} // #![feature(const_fn)]

@MajorBreakfast ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

{ Public, Private } โŠ‡ Function  โ†’ put `pub` in front of `fn`
{ Public, Private } โŠ‡ Struct    โ†’ put `pub` in front of `struct`
{ Public, Private } โŠ‡ Trait     โ†’ put `pub` in front of `trait`
{ Public, Private } โŠ‡ Enum      โ†’ put `pub` in front of `enum`
Function โŠ‡ {Async, Sync}        โ†’ put `async` in back of `fn`
Variable โŠ‡ {Mutable, Imutable}  โ†’ put `mut` in back of `let`

@xmeta @MajorBreakfast

async fn ๋Š” ๋‚˜๋ˆŒ ์ˆ˜ ์—†์œผ๋ฉฐ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.ใ€‚

async fn ๋Š” ์ „์ฒด์ž…๋‹ˆ๋‹ค.

pub fn ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ณต๊ฐœ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ pub async fn ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ณต๊ฐœ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

@ZhangHanDong

  • async fn ๋Š” ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋Š” "๋น„๋™๊ธฐ"๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. async fn ์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์™€ ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋†€์ดํ„ฐ์˜ ์˜ˆ ์ž…๋‹ˆ๋‹ค. "async fn"์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰์€ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋งŒ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ฐพ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • pub fn ํ•˜๋ฉด unsafe ๋˜๋Š” const ๊ธฐ๋Šฅ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ยฐ async fn ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์€ ๋ฌผ๋ก  ์ต๋ช…์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ง์€ ๋‘˜ ๋‹ค Future ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

@xmeta ๋Š” mut ๊ฐ€ "let ์ดํ›„์—" ๊ฐ€์ง€ ์•Š๊ณ , ์˜คํžˆ๋ ค mut ๊ฐ€ let ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. let ๋Š” ํŒจํ„ด์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰,

let PATTERN = EXPRESSION;

mut ์˜ ์ผ๋ถ€์ธ PATTERN ,ํ•˜์ง€์˜ let ์ž์ฒด. ์˜ˆ๋ฅผ ๋“ค์–ด:

// one is mutable one is not
let (mut a, b) = (1, 2);

@steveklabnik ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ณ„์ธต ๊ตฌ์กฐ์™€ ๋‹จ์–ด ์ˆœ์„œ ์‚ฌ์ด์˜ ์—ฐ๊ด€์„ฑ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์—ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

async ๋ธ”๋ก ๋‚ด์—์„œ ์›ํ•˜๋Š” return ๋ฐ break ํ–‰๋™์— ๋Œ€ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ƒ๊ฐ์€? ํ˜„์žฌ return ๋Š” ๋น„๋™๊ธฐ ๋ธ”๋ก์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. return ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฒ ์ €ํ•˜๊ฒŒ ๊ธˆ์ง€ ํ•  ์ˆ˜ return ๊ฐ™์€ ์‚ฌ์šฉ ๋ญ”๊ฐ€ 'label: async { .... break 'label x; } ๋น„๋™๊ธฐ ๋ธ”๋ก์—์„œ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ break-to-blocks ๊ธฐ๋Šฅ(https://github.com/rust-lang/rust/issues/)์— ํ‚ค์›Œ๋“œ break ๋˜๋Š” return ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๋Œ€ํ™”์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. 48594).

return ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ํ˜„์žฌ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ ๋ธ”๋ก์—์„œ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์˜์‹ฌํ•œ๋‹ค. ํ์‡„๋Š” ์ด๋ฏธ return ํ—ˆ์šฉํ•˜๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์„ ๊ฒฐ์ฝ” ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. return ๊ฐ€ ๋น„๋™๊ธฐ ๋ธ”๋ก์—๋„ ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€ IMO๊ฐ€ ์‰ฝ๊ณ  IMO๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@cramertj return ๋Š” ํ•ญ์ƒ ๋‚ด๋ถ€ ๋ธ”๋ก์ด ์•„๋‹ˆ๋ผ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž์ง€ ์•Š์œผ๋ฉด return ๊ฐ€ ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด break ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํ•ด ๋ณด์ด์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋ ˆ์ด๋ธ” ๊ตฌ๋ถ„ ๊ฐ’์ด ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด ์ตœ์†Œํ•œ ๊ทธ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ด๋™ ๋ฐ ํ์‡„๊ฐ€ ์•„์ง ๊ณ„ํš๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ์€ RFC์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// closure which is evaluated immediately
async move {
     // asynchronous portion of the function
}

๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง€ ์•„๋ž˜๋กœ

async { /* body */ }

// is equivalent to

(async || { /* body */ })()

return ๊ฐ€ ํด๋กœ์ €์™€ ์ผ์น˜ํ•˜๋„๋ก ํ•˜๊ณ  ์„ ํƒํ•˜๊ณ  ์„ค๋ช…ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

break-to-block rfc๋Š” ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋‚ด๋ถ€ ํด๋กœ์ €์—์„œ ๋›ฐ์–ด๋‚ด๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๊ณ„ํšํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ(๊ทธ๋ฆฌ๊ณ  ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค), returns ์˜ ์ผ๊ด€๋œ ๋™์ž‘์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ break-to-blocks์˜ rfc์™€๋„ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@memoryruins async || { ... return x; ... } ๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. async { ... return x; ... } ๋Š” async ๊ฐ€ ํด๋กœ์ €๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— async ๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค . return ๋Š” "ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜"์ด๋ผ๋Š” ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ์‡„๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ธ”๋ก์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@memoryruins ๋‘˜ ๋‹ค ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@joshtriplett

๋น„๋™๊ธฐ ๋ธ”๋ก์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๊ทธ๊ฒƒ๋“ค์„ ํฌํ•จํ•˜๋Š” ๋ธ”๋ก์—์„œ ๋ณ„๋„๋กœ ์ •์˜๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๋ณธ๋ฌธ์ด๋ผ๋Š” ์˜๋ฏธ์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ์—ฌ์ „ํžˆ ํ•จ์ˆ˜๋กœ ์ƒ๊ฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ return ๊ฐ€ async ๋ธ”๋ก. ์—ฌ๊ธฐ์„œ ํ˜ผ๋™์€ ๋Œ€๋ถ€๋ถ„ ๊ตฌ๋ฌธ๋ก ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ธ”๋ก์€ ์ผ๋ฐ˜์ ์œผ๋กœ || ๋ฐ async ์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค.

@cramertj "๊ตฌ๋ฌธ"์€ ์ค‘์š”ํ•˜์ง€๋งŒ.

์ด๋Ÿฐ ์‹์œผ๋กœ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ (๋˜๋Š” ํด๋กœ์ €์™€ ๋น„์Šทํ•˜๊ณ  ํด๋กœ์ €๋ฅผ ํ•จ์ˆ˜๋กœ ์ธ์‹ํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•จ)์ด ์žˆ๊ณ  return ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ ๋ฉ˜ํƒˆ ํŒŒ์„œ๋Š” ์–ด๋””๋กœ ๊ฐ€๊ฒ ์Šต๋‹ˆ๊นŒ?

return ๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ ์–ด๋„ break ๊ฐ€ ์ผ๋ถ€ ์ƒ์œ„ ๋ธ”๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์–ด๋–ค ๋ธ”๋ก์ธ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด์— ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. return ๋Š” ํ•ญ์ƒ ์ „์ฒด ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๋” ํฐ ๋ง์น˜์˜€์Šต๋‹ˆ๋‹ค.

์ฆ‰์‹œ ํ‰๊ฐ€๋œ ํด๋กœ์ €์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฐ˜ํ™˜์ด ํŠนํžˆ ๊ตฌ๋ฌธ์ ์œผ๋กœ ์ผ๊ด€์„ฑ์ด ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ธ”๋ก์˜ ? ๊ฐ€ ์ด๋ฏธ ๊ฒฐ์ •๋œ ๊ฒฝ์šฐ(RFC๋Š” ์—ฌ์ „ํžˆ ๋ฏธ์ •์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค), ๊ทธ์— ๋งž์ถฐ ์ •๋ ฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@joshtriplett ํ•จ์ˆ˜์™€ ํด๋กœ์ €(๊ตฌ๋ฌธ์ ์œผ๋กœ ๋งค์šฐ ๋‹ค๋ฅธ)๋ฅผ "๋ฐ˜ํ™˜ ๋ฒ”์œ„"๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋น„๋™๊ธฐ ๋ธ”๋ก์€ ๊ฐ™์€ ์ค„์„ ๋”ฐ๋ผ ์ธ์‹ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์ œ๊ฒŒ๋Š” ์ž„์˜์ ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋ณ„๊ฐœ์˜ ๊ตฌ๋ฌธ ํ˜•์‹์€ ํ—ˆ์šฉ๋˜์ง€๋งŒ 3๊ฐœ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

RFC์—์„œ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์‚ฌ์ „ ๋…ผ์˜ ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ๋ ˆ์ด๋ธ”์„ ์ œ๊ณตํ•  ํ•„์š” ์—†์ด break _without_ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋™๊ธฐ ๋ธ”๋ก์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค(๋น„๋™๊ธฐ ๋ธ”๋ก์—์„œ ์™ธ๋ถ€ ๋ฃจํ”„๋กœ ๋‚˜๊ฐˆ ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ํ‘œํ˜„๋ ฅ์„ ์žƒ์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

@withoutboats ํด๋กœ์ €๋Š” ๋˜ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. "ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค"๋ฅผ ๋ฐฐ์šฐ๋ฉด " return ํ•ญ์ƒ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜"์„ ํฌํ•จํ•˜์—ฌ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํด๋กœ์ €์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Nemo157 ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์ง€ ์•Š์€ break ๋Œ€์ƒ์ด async ๋ธ”๋ก์ธ ๊ฒฝ์šฐ์—๋„ ๋น„๋™๊ธฐ ๋ธ”๋ก ๋‚ด๋ถ€์˜ ๋ฃจํ”„์—์„œ ์ผ์ฐ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜(์˜ˆ 'label: async )์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .

@joshtriplett

ํด๋กœ์ €๋Š” ๋˜ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ํ•จ์ˆ˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. "ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์ด๋‹ค"๋ฅผ ๋ฐฐ์šฐ๋ฉด "๋ฐ˜ํ™˜์€ ํ•ญ์ƒ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜"์„ ํฌํ•จํ•˜์—ฌ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํด๋กœ์ €์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async ๋ธ”๋ก๋„ ์ผ์ข…์˜ "ํ•จ์ˆ˜"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋น„๋™๊ธฐ์‹์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๊ณ  ๋ฏธ๋ฆฌ ์ ์šฉ๋œ async ํด๋กœ์ €์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

@cramertj ์˜ˆ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•”์‹œ์  ์ค‘๋‹จ์ ์—๋„ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(ํ˜„์žฌ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•จ).

์ œ์–ด ํ๋ฆ„์„ ๋”ฐ๋ฅด๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ฒƒ, ํŠนํžˆ return ์˜๋ฏธ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฝ๋Š” ๋Šฅ๋ ฅ์— ์ƒ๋‹นํ•œ ๋ถ€๋‹ด์„ ์ค๋‹ˆ๋‹ค.

๊ฐ™์€ ๋งฅ๋ฝ์—์„œ C์˜ ํ‘œ์ค€ ์ง€์นจ์€ "๋งคํฌ๋กœ ์ค‘๊ฐ„์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋œ ์ผ๋ฐ˜์ ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ฃจํ”„์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด break ๋ฐ continue ๊ฐ€ ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ๋‘ ๊ฐœ์˜ ๋ฃจํ”„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฃจํ”„ ๊ฐ™์€ ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์œผ๋ฏ€๋กœ break ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ๋ธ”๋ก๋„ ์ผ์ข…์˜ "๊ธฐ๋Šฅ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„์˜ ๋‚ด๋ถ€๋ฅผ ์•„๋Š” ๊ฒƒ์— ๊ธฐ๋ฐ˜ํ•œ ๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ „ํ˜€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ „ํ˜€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@joshtriplett

๋‚ด ์˜์‹ฌ์€ return ๊ฐ€ ํด๋กœ์ € ๋‚ด์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๊ณ  ์ •์˜ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋™์ผํ•œ ์ฃผ์žฅ์„ ์ฒ˜์Œ์œผ๋กœ ํด๋กœ์ €๊ฐ€ ์žˆ๋Š” ์–ธ์–ด์— ์ ์šฉํ–ˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ Scala์™€ ๊ฐ™์ด ์ด ํ•ด์„์„ ์ทจํ•˜๋Š” ์–ธ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@cramertj ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋‚ด์— ์ •์˜๋œ ๋žŒ๋‹ค ๋ฐ/๋˜๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. (์ด์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ์ถœ์€ Python, FWIW์—์„œ ๋žŒ๋‹ค๊ฐ€ return ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ์ค‘์ฒฉ ํ•จ์ˆ˜์—์„œ return ๋Š” return ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.)

๋น„๋™๊ธฐ ๋ธ”๋ก์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋˜๋ฉด return ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ง€์—ฐ๋œ ์‹คํ–‰์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉด return ๊ฐ€ ํ•จ์ˆ˜์— ์ ์šฉ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค. ๋ธ”๋ก์ด ์‹คํ–‰๋  ๋•Œ ์ด๋ฏธ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. IMO์—์„œ ์ด๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์–ด๋ ค์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด RFC๋Š” return , break ๋ฐ continue ์™€ ๊ฐ™์€ ? -operator ๋ฐ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์„ฑ์ด ๋น„๋™๊ธฐ ๋ธ”๋ก ๋‚ด์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ „์šฉ RFC๊ฐ€ ์ž‘์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋ธ”๋ก์„ ์—ฐ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๊นŒ? ๋‚˜์ค‘์— ๋…ผ์˜ํ•  ๋‹ค๋ฅธ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ๋น„๋™๊ธฐ ํ•จ์ˆ˜, ํด๋กœ์ € ๋ฐ await! :)

์—ฌ๊ธฐ @memoryruins์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋” ์ž์„ธํžˆ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ RFC๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

core::task::context() ๋ผ๊ณ  ํ•˜๋Š” ๋น„๋™๊ธฐ fn ๋‚ด๋ถ€์—์„œ ์ปจํ…์ŠคํŠธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์™ธ๋ถ€์—์„œ async fn์„ ํ˜ธ์ถœํ•˜๋ฉด ํŒจ๋‹‰ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์— ์•ก์„ธ์Šคํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๋งค์šฐ ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@MajorBreakfast ๊ทธ ํ•จ์ˆ˜๋Š” lazy

async fn foo() -> i32 {
    await!(lazy(|ctx| {
        // do something with ctx
        42
    }))
}

์‚ฐ๋ž€๊ณผ ๊ฐ™์€ ๋” ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์—๋Š” ๋” ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async fn foo() -> i32 {
    let some_task = lazy(|_| 5);
    let spawned_task = await!(spawn_with_handle(some_task));
    await!(spawned_task)
}

@Nemo157 ์‹ค์ œ๋กœ spawn_with_handle ๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ 0.3์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ spawn_with_handle ๋Š” ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๋ฏธ๋ž˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค( ์ฝ”๋“œ ์ฐธ์กฐ ). ๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ spawn_with_handle ๋ฉ”์„œ๋“œ๋ฅผ ContextExt ํ•˜๊ณ  spawn_with_handle ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๋ฌด๋ฃŒ ํ•จ์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

fn poll(self: PinMut<Self>, cx: &mut Context) -> Poll<Self::Output> {
     let join_handle = ctx.spawn_with_handle(future);
     ...
}
async fn foo() {
   let join_handle = spawn_with_handle(future); // This would use this function internally
   await!(join_handle);
}

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ด์ค‘ ๋Œ€๊ธฐ ๋„Œ์„ผ์Šค๋ฅผ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด ๋ฉ”์„œ๋“œ๋Š” core::task::with_current_context() ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๊ณ  ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด ํ•จ์ˆ˜๋Š” ์ด๋ฏธ get_task_cx ์ด๋ฆ„์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค . ํ˜„์žฌ ๊ธฐ์ˆ ์ ์ธ ์ด์œ ๋กœ libstd์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ libcore์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ๊ณต๊ฐœ API๋กœ ๋งŒ๋“ค ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

async ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” TLS ์™ธ๋ถ€๋กœ ์ด๋™๋œ ํ›„ ์ผ๋ถ€ ์ƒ์œ„ async ํ•จ์ˆ˜์—์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ์ปจํ…์ŠคํŠธ๋Š” async ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ˆจ๊ฒจ์ง„ ์ง€์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋  ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ ์ปจํ…์ŠคํŠธ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋Š” ๋งคํฌ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ spawn_with_handle ์„ ๊ฐ€์งˆ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€

fn spawn_with_handle(executor: &mut Executor, future: impl Future) { ... }

async fn foo() {
    let join_handle = spawn_with_handle(async_context!().executor(), future);
    await!(join_handle);
}

@Nemo157 ๋‚ด ์ƒ๊ฐ์— ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” async fn ๋‚ด์—์„œ ์ง์ ‘ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ spawn_with_handle await ๋‚ด๋ถ€์ ์œผ๋กœ select! ๋ฐ join! ).

async fn foo() {
    let join_handle = spawn_with_handle!(future);
    await!(join_handle);
}

์ด๊ฒƒ์€ ๋ณด๊ธฐ์— ์ข‹๊ณ  ๋งคํฌ๋กœ ๋‚ด๋ถ€์˜ await!(lazy(|ctx| { ... })) ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async_context!() ๋Š” ๋Œ€๊ธฐ ์ง€์ ์—์„œ ์ปจํ…์ŠคํŠธ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

async_context!() ๋Š” ๋Œ€๊ธฐ ์ง€์ ์—์„œ ์ปจํ…์ŠคํŠธ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„์— ๋”ฐ๋ผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ƒ์„ฑ๊ธฐ ์ธ์ˆ˜๊ฐ€ ๋ถ€ํ™œํ•˜๋ฉด ์–ด์จŒ๋“  ์–‘๋ณด ์ง€์ ์—์„œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ธ์ˆ˜ ๋’ค์— ์žˆ๋Š” ๊ฐ’์€ ์–‘๋ณด ์ง€์ ๊นŒ์ง€๋งŒ ์‹คํ–‰๋˜๋Š” ์ˆ˜๋ช…์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. Async/await๋Š” ํ•ด๋‹น ์ œํ•œ์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.

@Nemo157 ์ด๋Ÿฐ ๋ง์”€ ์ด์‹ ๊ฐ€์š”?

let my_arg = yield; // my_arg lives until next yield

@Pzixel _์•„๋งˆ๋„ _ ์˜ค๋ž˜๋œ ํ† ๋ก ์„

์˜ˆ, await!() ๊ตฌ๋ฌธ์ด ? ์™€ ๊ฐ™์€ ๊ฒƒ๊ณผ ๊ฒฐํ•ฉํ•  ๋•Œ ๋ชจํ˜ธ์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ์ด ๊ตฌ๋ฌธ์ด ๋‹จ์ผ ํ”„๋กœ์ ํŠธ์—์„œ ์ฒœ ๋ฒˆ์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์งœ์ฆ๋‚œ๋‹ค๋Š” ์ ์—๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹œ๋„๋Ÿฝ๊ณ  ๊นจ๋—ํ•œ ์ฝ”๋“œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ something_async()@ ๊ฐ€ await ์™€ ๋น„๊ต๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ ‘๋ฏธ์‚ฌ ๊ธฐํ˜ธ(์ด์ „์— ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰๋จ)์— โ€‹โ€‹๋Œ€ํ•œ ์‹ค์ œ ์ธ์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ await ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @ ๋Š” await์˜ a ์™€ ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋ฏธ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ๊ธฐํ˜ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ? ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋œ try!() ๋น„์Šทํ•œ ์ผ์ด ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ ์„ ํƒ์ด ๋…ผ๋ฆฌ์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค(์ •ํ™•ํžˆ ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฝ๊ณ  ํƒ€์ดํ•‘ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฉ‹์ง„ ์ ์€ ? ๊ธฐํ˜ธ์™€ ๊ฒฐํ•ฉํ•  ๋•Œ ๋™์ž‘์ด ์ฆ‰์‹œ ๋ช…ํ™•ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ ๊ทธ๋Ÿด ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค). ๋‹ค์Œ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

// Await, then unwrap a Result from the future
awaiting_a_result()@?;

// Unwrap a future from a result, then await
result_with_future()?@;

// The real crazy can make it as funky as they want
magic()?@@?@??@; 
// - I'm joking, of course

await future? ๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋Š” ํ•œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ์ง€ ์ฒซ๋ˆˆ์— ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌํ˜„์€ ? ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ _์‚ฌ์†Œํ•œ_ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•„๋งˆ๋„ await ์™€ ๋‹ฌ๋ฆฌ ๋„ˆ๋ฌด ๊ฐ„๊ฒฐํ•˜๊ณ  ๋œ ๋ˆˆ์— ๋„๊ฑฐ๋‚˜ ์žฅํ™ฉํ•ด์„œ ํ•จ์ˆ˜์—์„œ ์ •์ง€ ์ง€์ ์„ _์–ด๋ ต๊ฒŒ_ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • async ํ‚ค์›Œ๋“œ์™€ ๋น„๋Œ€์นญ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜๋Š” ํ‚ค์›Œ๋“œ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ธฐํ˜ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await!() ๋Š” ๋งคํฌ๋กœ ๋Œ€ ํ‚ค์›จ์–ด๋ผ๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐํ˜ธ๋ฅผ ์„ ํƒํ•˜๋ฉด ๋˜ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์š”์†Œ์™€ ๋ฐฐ์šธ โ€‹โ€‹์ ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@phaux ๋Š” ~ ๊ธฐํ˜ธ์˜ ์‚ฌ์šฉ๋„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด ์บ๋ฆญํ„ฐ๊ฐ€ ๊ฝค ๋งŽ์€ ํ‚ค๋ณด๋“œ ๋ ˆ์ด์•„์›ƒ์— ํƒ€์ดํ•‘ํ•˜๊ธฐ์—๋Š” ํŽ‘ํ‚คํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๊ทธ ์•„์ด๋””์–ด๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„ ์ƒ๊ฐ์€ ์–ด๋– ์„ธ์š”? try!() _became_ ? ์™€ ๋น„์Šทํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ? await ๋˜๋Š” ๊ธฐํ˜ธ๋ฅผ ์„ ํ˜ธํ•˜๋ฉฐ ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๋Š” ๋ฐ ๋ฏธ์ณค์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋†“์นœ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ๊ฐ€ ์‚ฌ์šฉํ•œ ์ž˜๋ชป๋œ ์šฉ์–ด๊ฐ€ ์žˆ์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

sigil ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ ๊ฑฑ์ •์€ ์นœ์ ˆํ•˜๊ฒŒ ์‹œ์—ฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๊ธ€๋ฆฌํ”„ ์ˆ˜ํ”„๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Perl(6 ์ด์ „ ๋ฒ„์ „)์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ดํ•ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์ธ ๋…ธ์ด์ฆˆ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์‹ค์ œ๋กœ try! ์™€ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ช…์‹œ์ ์ธ async!(foo) ๋งคํฌ๋กœ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ํ•„์š”ํ•˜๋ฉด ์„คํƒ•์ด ๋  ์ผ๋ถ€ sigil์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ๋‚˜์ค‘์œผ๋กœ ๋ฏธ๋ฃจ๊ณ  ์žˆ์ง€๋งŒ async!(foo) ๋Š” async/await์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต์— ์ถฉ๋ถ„ํ•˜๋ฉฐ ์ƒ๋Œ€์ ์œผ๋กœ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  try! / ? ์˜ ์„ ๋ก€๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์ธ์žฅ์ด ์žˆ์–ด์•ผ ํ•จ)

@withoutboats ์ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์ง€ ์•Š์•˜์ง€๋งŒ ๊ตฌํ˜„์— ๋„์›€์„ ์ฃผ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐœ๋ฐœ ์ง€์ ์€ ์–ด๋””์ž…๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ณ ๋ ค ์‚ฌํ•ญ๊ณผ ๊ด€๋ จํ•˜์—ฌ Rust ์ปค๋ฎค๋‹ˆํ‹ฐ ์™ธ๋ถ€์˜ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? Joe Duffy ๋Š” ๋™์‹œ์„ฑ์— ๋Œ€ํ•ด ๋งŽ์€ ๊ฒƒ์„ ์•Œ๊ณ  ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ ์‚ฌ์†Œํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์•„์ฃผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ RustConf ์—์„œ ์— ์‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@BatmanAoD ์ดˆ๊ธฐ ๊ตฌํ˜„์€ https://github.com/rust-lang/rust/pull/51580 ์— ์ฐฉ๋ฅ™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜ RFC ์Šค๋ ˆ๋“œ์—๋Š” Rust ์™ธ๋ถ€์—์„œ๋„ PLT ๋ถ„์•ผ์˜ ์—ฌ๋Ÿฌ ์ „๋ฌธ๊ฐ€๋กœ๋ถ€ํ„ฐ ์˜๊ฒฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. :)

๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— Futures๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” '$' ๊ธฐํ˜ธ๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋†๋‹ด์ด์•ผ. ๊ธฐ๋‹ค๋ฆผ์˜ ์ƒ์ง•์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋ชจ๋‘ ๋ช…์‹œ์ ์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ๋ฐœ์— ์ด์„ ์˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์–ธ์–ด๋กœ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐํ˜ธ๋Š” await! ๋งคํฌ๋กœ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ชจํ˜ธํ•˜๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์ฝ๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์— ์ด์„ ์  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ? ๊ฐ€ ๋„ˆ๋ฌด ๋จผ ๋‹จ๊ณ„๋ผ๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ async fn ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” async ํ‚ค์›Œ๋“œ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋น„๋™๊ธฐ์— ๋Œ€ํ•œ ์ผ์ข…์˜ "ํŽธํ–ฅ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์™œ async๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ํ•„์š”ํ•˜์ง€๋Š” ์•Š์€ ๋˜ ๋‹ค๋ฅธ ์ถ”์ƒํ™”์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” async ์†์„ฑ์ด ๋” ๊ฐ•๋ ฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋ณธ Rust ๋ฐฉ์–ธ์˜ "ํ™•์žฅ"์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์–ธ์–ด ์„ค๊ณ„์ž๋Š” ์•„๋‹ˆ์ง€๋งŒ JavaScript์—์„œ Promises๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒฝํ—˜์ด ์žˆ์œผ๋ฉฐ ๊ฑฐ๊ธฐ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ์‹์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ฆ๊ฒ๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@steveklabnik ์•„, move ์ง€์›์ด ์—†๋Š” ๊ตฌํ˜„"๊ณผ "์ „์ฒด ๊ตฌํ˜„"์œผ๋กœ ๋ถ„ํ• ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ ๊ตฌํ˜„ ๋ฐ˜๋ณต์ด ์ผ๋ถ€ ๊ณต๊ฐœ ๋ถ„๊ธฐ/๋ถ„๊ธฐ์—์„œ ์ž‘์—…๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด RFC 2418์ด ์Šน์ธ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

RFC๊ฐ€ ์•„๋‹Œ ์—ฌ๊ธฐ์—์„œ async/await ๊ตฌ๋ฌธ ๋ฌธ์ œ๊ฐ€ ๋…ผ์˜๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@c-edw async ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์€ What Color is Your Function?

@parasyte ๊ทธ ๊ฒŒ์‹œ๋ฌผ์€ ์‚ฌ์‹ค ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๊ทธ๋ฆฐ ์Šค๋ ˆ๋“œ ์Šคํƒ€์ผ์˜ ๋™์‹œ์„ฑ์ด ์—†๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ „์ฒด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ฃผ์žฅ์ด๋ผ๋Š” ๊ฒƒ์ด ์ œ๊ฒŒ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋…น์ƒ‰ ์Šค๋ ˆ๋“œ๊ฐ€ (๊ด€๋ฆฌ๋˜๋Š”) ๋Ÿฐํƒ€์ž„ ์—†์ด ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์—†๊ณ  Rust๊ฐ€ ์ด๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž…์žฅ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ธ€์„ ์ฝ์œผ์‹  ๋ถ„๋“ค์€ async / await ์‹œ๋งจํ‹ฑ ์€ ๊ดœ์ฐฎ์€๋ฐ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ๊ฒฐ๋ก ์€? ํ™•์žฅํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ฑฐ๊ธฐ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ๊ฒฌํ•ด์—๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” async ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ ๊ธฐ์‚ฌ์— ๊ทธ ์ด์œ ๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์ž๊ฐ€ ๋‚ด๋ฆฐ ๊ฒฐ๋ก ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@parasyte ์•„, ์•Œ์•˜์–ด. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋นจ๊ฐ•/ํŒŒ๋ž‘ ์ด๋ถ„๋ฒ•์„ ์‹ซ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์ด ๊ทธ ๋ฐ˜๋Œ€๋ฅผ ๋งํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!

๋‚ด๊ฐ€ ์ •์˜๋ฅผ ์ œ๋Œ€๋กœ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๋ถ„๋ฒ•์€ ํ”ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋งŒ๋“ค์–ด ๋™๊ธฐํ™” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์กด์žฌํ•˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ์ง€์šฐ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋„๋ฆฌ๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์˜ ์™ธ๊ด€ ๋’ค์— ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ์ˆจ๊ฒจ ์ด๋ถ„๋ฒ•์„ ์ง€์šฐ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. gevent๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๊ณผ ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ ์ด๋ถ„๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

  • ๋ฏธ๋„๋ฆฌ๋Š” await ํ‚ค์›Œ๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์— async ํ‚ค์›Œ๋“œ๋„ ๋„์ž… ํ–ˆ์Šต๋‹ˆ๋‹ค .
  • gevent๋Š” ์ •์ƒ์ ์ธ ๋ชจ์–‘์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์•”์‹œ์  ๋Œ€๊ธฐ ์™ธ์— gevent.spawn ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‚ด๊ฐ€ ๊ธฐ๋Šฅ๋ณ„ ์ƒ‰์ƒ ๊ธฐ์‚ฌ๋ฅผ ๊ฐ€์ ธ์˜จ ์ด์œ ์ž…๋‹ˆ๋‹ค. "๋น„๋™๊ธฐ๊ฐ€ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ๋™๊ธฐ ์ฝ”๋“œ๋ผ๋„ "์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ"(์กฐ์ธ)๊ณผ "์ž‘์—… ์‹œ์ž‘ํ•˜๊ธฐ"(์Šคํฐ)๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ๋น„๋™๊ธฐ์€ (๊ตฌํ˜„ ํ˜„๋ช…)์ž…๋‹ˆ๋‹ค ๋‹น์‹ ์€ ์–ธ์–ด๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์•„๋ฌด๋Ÿฐ ์ฃผ์„์ด ์—†๋‹ค await (์ด๊ฒƒ์€ ๊ธฐ๋ณธ ๋™์ž‘์ด๊ธฐ ๋•Œ๋ฌธ์—), ๋ฏธ๋„๋ฆฌ์˜ async ๋Œ€์‹  ์ „๋‹ฌ ํ์‡„์ž…๋‹ˆ๋‹ค spawn API. ์ด๊ฒƒ์€ all-sync์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ตฌ๋ฌธ/๊ธฐ๋Šฅ-์ƒ‰์ƒ ๊ธฐ๋ฐ˜์— all-async๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” async๊ฐ€ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ž๊ฒฉ์ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, Rust๊ฐ€ ์ด ์ˆ˜์ค€์—์„œ ๊ตฌํ˜„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๊ณ  ๊ทธ๋Ÿฐ ์ด์œ ๋กœ ๋‘ ๊ฐ€์ง€ ์ƒ‰์ƒ์„ ๋ชจ๋‘ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒŒ ๋” ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@rpjohnst ์˜ˆ, ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ์„ ์ˆจ๊ธฐ๋Š” ๊ฒƒ๊ณผ ๊ฐœ๋…์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ™์€ ์Šค๋ ˆ๋“œ์˜ ๋…น ํฌ๋Ÿผ์—์„œ ๋น„ํŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋™๊ธฐ์ ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋™๊ธฐ์ ์ด๊ณ  ์ฐจ๋‹จ๋  ๋•Œ ํŠนํžˆ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์‹ค์ œ ์žฌ์•™์ž…๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๊ฒƒ์ด ๋น„๋™๊ธฐ์‹์ธ ์–ธ์–ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ด๋ถ„๋ฒ•์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

IIUC ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฏธ๋„๋ฆฌ์˜ ์‹œ๋„์˜€๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ํ‚ค์›Œ๋“œ ๋Œ€ ํด๋กœ์ €๋Š” ์˜๋ฏธ๋ก ์  ๋…ผ์Ÿ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

2018๋…„ 7์›” 12์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 3์‹œ 1๋ถ„, Russell Johnston [email protected]
์ผ๋‹ค:

์™œ ์ด๋ถ„๋ฒ•์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ๊ฑฐ๋กœ ํ‚ค์›Œ๋“œ์˜ ์กด์žฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„์ง ๋ฏธ๋„๋ฆฌ์—๋Š” ์กด์žฌํ•œ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•˜๋ฉด ์ด๋ถ„๋ฒ•์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋งŒํผ
๊ตฌ๋ฌธ์€ ๋ชจ๋“  ๋™๊ธฐํ™” ์ฝ”๋“œ์™€ ๋™์ผํ•˜์ง€๋งŒ async ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์•”ํ˜ธ.

๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด
๋™๊ธฐ์ ์œผ๋กœ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜

_์™€, ๋ˆ„๊ตฐ๊ฐ€ ๋ฏธ๋„๋ฆฌ๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ•ญ์ƒ ์ž‘์—…ํ•˜๋Š” ์‚ด์•„์žˆ๋Š” ์ƒ๋ฌผ์ด ๊ฑฐ์˜ ์—†๋Š” ํ์‡„ํ˜• ํ”„๋กœ์ ํŠธ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„ ์ค‘ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์จ ์ฃผ๋ฉด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค._

/์ฃผ์ œ๋ฅผ ๋ฒ—์–ด

@Pzixel ํ”„๋กœ์ ํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์ž‘์—… ์ค‘์ธ ์ƒ๋ฌผ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Joe Duffy์˜ ๋ธ”๋กœ๊ทธ์—๋Š” ํฅ๋ฏธ๋กœ์šด ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฒ ๋กœ๋ฅผ ๋ฒ—์–ด๋‚ฌ๊ณ , ์ œ ์ž์‹ ์„ ๋˜ํ’€์ดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ ๊ทธ๊ฒƒ์€ "ํ‚ค์›Œ๋“œ์˜ ์กด์žฌ"์˜ ์ผ๋ถ€์ธ await ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๋ฅผ spawn ๋ฐ join spawn ์™€ ๊ฐ™์€ API๋กœ ๋ฐ”๊พธ๋ฉด Midori์™€ ๊ฐ™์ด ์™„์ „ ๋น„๋™๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ (Midori์™€ ๋‹ฌ๋ฆฌ) ์ด๋ถ„๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ง๋กœ ํ•˜๋ฉด, ๋‚ด๊ฐ€ ์ „์— ๋งํ–ˆ๋“ฏ์ด, ๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์„ ํƒ์„ ์› ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์„ ๊ฐ€์งˆ ๋ฟ์ž…๋‹ˆ๋‹ค.

@CyrusNajmabadi ๋‹ค์‹œ ํ•‘์„ ์—ฌ๊ธฐ ์— ์˜์‚ฌ ๊ฒฐ์ •์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ์ €์—๊ฒŒ ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋‹น์‹ ์ด ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

#wg-net discord ์ฑ„๋„์—์„œ :

@cramertj
์ƒ๊ฐํ•  ๊ฑฐ๋ฆฌ: ์ €๋Š” ์ข…์ข… async { ... } ๋ธ”๋ก์˜ ๋์— Ok::<(), MyErrorType>(()) ๋ฅผ ์”๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๋” ์‰ฝ๊ฒŒ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@withoutboats
[...] ์•„๋งˆ๋„ [ try ]์™€ ์ผ์น˜ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?

( try ๋ธ”๋ก์ด ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋น„๊ต์  ์ตœ๊ทผ์˜ ๋…ผ์˜๋ฅผ ๊ธฐ์–ตํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...)

์–ธ๊ธ‰๋œ ์ƒ‰์กฐ:

async -> io::Result<()> {
    ...
}

async: io::Result<()> {
    ...
}

async as io::Result<()> {
    ...
}

try ๊ฐ€ async ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ ๋œํ•˜์ง€๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ์œ ํ˜• ์ง€์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

let _: io::Result<()> = try { ... };
let _: impl Future<Output = io::Result<()>> = async { ... };

๋‚˜๋Š” ์ด์ „์— Future ํŠธ๋ ˆ์ž‡(์˜ˆ: Future -> io::Result<()> ๋Œ€ํ•ด fn๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ๋˜์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ์ „ํžˆ ๋งŽ์€ ๋ฌธ์ž๊ฐ€ ์žˆ์ง€๋งŒ ์ˆ˜๋™ ์œ ํ˜• ์ œ๊ณต ์˜ต์…˜์ด ์ข€ ๋” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

let _: impl Future -> io::Result<()> = async {
}
async -> impl Future<Output = io::Result<()>> {
    ...
}

๋‚ด ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ํด๋กœ์ € ๊ตฌ๋ฌธ ๊ณผ ์œ ์‚ฌ

|x: i32| -> i32 { x + 1 };

ํŽธ์ง‘: ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ TryFuture ๊ฐ€ Future ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๋•Œ:

async -> impl TryFuture<Ok = i32, Error = ()> {
    ...
}

Edit2: ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์œ„์˜ ๋‚ด์šฉ์€ ์˜ค๋Š˜๋‚ ์˜ ํŠน์„ฑ ์ •์˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. TryFuture ์œ ํ˜•์€ ํ˜„์žฌ Future ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜๋‚  ๋งŒํผ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@MajorBreakfast ์™œ -> impl Future<Output = io::Result<()>> ์•„๋‹Œ -> io::Result<()> ์ธ๊ฐ€์š”? ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ async fn foo() -> io::Result<()> ๋Œ€ํ•ด return-type-desugaring์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ -> ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ IMO์—์„œ ๋™์ผํ•œ ์„คํƒ•์„ ์›ํ•  ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

@cramertj ๋„ค, ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด ๊ฒŒ์‹œ๋ฌผ์€ ์™ธ๋ถ€ ๋ฐ˜ํ™˜ ์œ ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์ด ์šฐ์ˆ˜ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ํ™•์‹ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜

async -> R { .. } ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ try -> R { .. } ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์œ ํ˜• ์ง€์ •์— ์ผ๋ฐ˜์ ์œผ๋กœ expr -> TheType ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜• ์ง€์ • ๊ตฌ๋ฌธ์€ ๋ชจ๋“  ๊ณณ์— ๊ท ์ผํ•˜๊ฒŒ ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@์„ผํŠธ๋ฆด ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -> ๊ฐ€ ์ •๋ง ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ธ์ง€ ๋” ์ด์ƒ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” -> ๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๊ณผ ์—ฐ๊ด€์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ๋ธ”๋ก์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@MajorBreakfast ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์ง€์ •์— : ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ async : Type { .. } , try : Type { .. } ๋ฐ expr : Type . ์šฐ๋ฆฌ๋Š” Discord์—์„œ ์ž ์žฌ์ ์ธ ๋ชจํ˜ธ์„ฑ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ ์˜๋ฏธ ์žˆ๋Š” : ๋‚˜์•„๊ฐˆ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ Either ์—ด๊ฑฐํ˜•์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. futures ์ƒ์ž์— Either ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ either ์ƒ์ž๊ฐ€ ์•„๋‹ ๋•Œ Either ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

Futures std์—์„œ ๋ณ‘ํ•ฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—(์ ์–ด๋„ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„) ๊ฑฐ๊ธฐ์— Either ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•จ์ˆ˜์—์„œ impl Future ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ €๋Š” ์ข…์ข… ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

fn handler() -> impl Future<Item = (), Error = Bar> + Send {
    someFuture()
        .and_then(|x| {
            if condition(&x) {
                Either::A(anotherFuture(x))
            } else {
                Either::B(future::ok(()))
            }
        })
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

async fn handler() -> Result<(), Bar> {
    let x = await someFuture();
    if condition(&x) {
        await anotherFuture(x);
    }
}

๊ทธ๋Ÿฌ๋‚˜ async ๊ฐ€ ํ™•์žฅ๋  ๋•Œ Either ๊ฐ€ ์—ฌ๊ธฐ์— ์‚ฝ์ž…๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด์— ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

_์›ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Pzixel async ํ•จ์ˆ˜ ๋‚ด๋ถ€์— Either ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. await ์„ ๋ฌผ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•œ async ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ๋ณ€ํ™˜์€ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ํ˜•์„ ์ง€์ •ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์— ๋‹จ์ผ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@Pzixel ๋˜ํ•œ https://github.com/rust-lang/rfcs/issues ์˜ ์ œํ•œ๋œ ๋ฒ„์ „์ด ๋„์ž…๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— (๊ฐœ์ธ์ ์œผ๋กœ) Either ๊ฐ€ ์ด RFC์™€ ํ•จ๊ป˜ ๋„์ž…๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. /2414 (์ด๋Š” 2๊ฐ€์ง€ ์œ ํ˜•์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ณ  Future s์—์„œ๋งŒ ์ž‘๋™ํ•จ), ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜ ์†”๋ฃจ์…˜์ด ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒฝ์šฐ API cruft๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @Nemo157์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ธด๊ธ‰ ์ƒํ™ฉ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ Either ์žˆ์Šต๋‹ˆ๋‹ค :)

@Ekleog ํ™•์‹คํžˆ, ์ €๋Š” ๊ธฐ์กด ๋น„๋™๊ธฐ ์ฝ”๋“œ์— ์‹ค์ œ๋กœ ์ˆ˜๋งŽ์€ either ๊ฐ€ ์žˆ๋‹ค๋Š” ์ด ์•„์ด๋””์–ด์— ์ถฉ๊ฒฉ์„ ๋ฐ›์•˜๊ณ  ์ •๋ง๋กœ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋Š” ์ข…์†์„ฑ์— either ํฌ๋ ˆ์ดํŠธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์„ ๋•Œ๊นŒ์ง€ ~30๋ถ„์„ ๋ณด๋ƒˆ์„ ๋•Œ ๋‚ด ํ˜ผ๋ž€์„ ํšŒ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฏธ๋ž˜์˜ ์˜ค๋ฅ˜๋Š” ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋Œ“๊ธ€์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๊ฒƒ์€ async/await ์—๋งŒ ๊ด€๋ จ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ด๋ฏ€๋กœ ์ž์ฒด RFC๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” futures ๊ฐ€ either ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž„์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค( IntoFuture ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด).

@Pzixel ์„ ๋ฌผ ์ƒ์ž์—์„œ ๋‚ด๋ณด๋‚ธ Either ๋Š” either ์ƒ์ž์—์„œ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๊ธฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. futures ํฌ๋ ˆ์ดํŠธ 0.3์€ ๊ณ ์•„ ๊ทœ์น™์œผ๋กœ ์ธํ•ด Either ๋Œ€ํ•ด Future ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด Either ๋Œ€ํ•œ Stream ๋ฐ Sink impls๋„ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์‹  ๋Œ€์•ˆ์„ ์ œ๊ณตํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค( ์—ฌ๊ธฐ์—์„œ ์„ค๋ช… ). ๋˜ํ•œ either ํฌ๋ ˆ์ดํŠธ๋Š” Future , Stream ๋ฐ Sink ์ž์ฒด๋ฅผ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ์•„๋ž˜์— ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, @Nemo157์ด ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์„ ๋ฌผ๋กœ ์ž‘์—…ํ•  ๋•Œ Either ๋Œ€์‹  ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

async : Type { .. } ์€ ์ด์ œ https://github.com/rust-lang/rfcs/pull/2522 ์—์„œ ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค

Send ์ž๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ (์•„์ง?) Send ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pub async fn __receive() -> ()
{
    let mut chan: futures::channel::mpsc::Receiver<Box<Send + 'static>> = None.unwrap();

    await!(chan.next());
}

์ „์ฒด ์žฌ์ƒ๊ธฐ( futures-0.3 ๋ถ€์กฑ์œผ๋กœ ๋†€์ดํ„ฐ์—์„œ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Œ)์— ๋Œ€ํ•œ ๋งํฌ๋Š” ์—ฌ๊ธฐ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•  ๋•Œ https://github.com/rust-lang/rust/issues/53249๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด ํ•ญ๋ชฉ์„ ์ตœ์ƒ์œ„ ๊ฒŒ์‹œ๋ฌผ์˜ ์ถ”์  ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :)

๋‹ค์Œ์€ Send ๊ตฌํ˜„ํ•˜๋Š” async/await ํ•จ์ˆ˜๊ฐ€ _should_ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋†€์ดํ„ฐ ์ž…๋‹ˆ๋‹ค. Rc ๋ฒ„์ „์˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์ด Send ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ์ง€๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์กฐ๊ธˆ ์‚ดํŽด๋ณด๊ณ (์ด ๊ธฐ๊ณ„์—๋Š” Rust ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค :slightly_frowning_face:) ์™œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Ekleog std::mpsc::Receiver ์€ Sync std::mpsc::Receiver ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ž‘์„ฑํ•œ async fn ์—๋Š” ์ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. !Sync ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” !Send ์ž…๋‹ˆ๋‹ค.

@cramertj ํ ... ํ•˜์ง€๋งŒ, ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด Send ์ธ ๊ฒฝ์šฐ Send ์—ฌ์•ผ ํ•˜๋Š” ์†Œ์œ  mpsc::Receiver ๋ณด์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? (๋˜ํ•œ std::mpsc::Receiver ์•„๋‹ˆ๋ผ futures::channel::mpsc::Receiver . type์ด Send ์ธ ๊ฒฝ์šฐ์—๋„ Sync . mpsc::Receiver ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@Nemo157 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋„ˆ๋ฌด ๋งŽ์€ ์†Œ์Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด https://github.com/rust-lang/rust/issues/53259๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. :)

async ๋ธ”๋ก์ด ? ๋ฐ ๊ธฐํƒ€ ์ œ์–ด ํ๋ฆ„์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ try ๋ธ”๋ก๊ณผ์˜ ์ผ๋ถ€ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณด์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: try async { .. } ๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ? return ์™€ ์œ ์‚ฌํ•œ ํ˜ผ๋™ ์—†์ด ?).

์ด๊ฒƒ์€ async ๋ธ”๋ก์˜ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด try ๋ธ”๋ก์˜ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ascription ๊ตฌ๋ฌธ RFC์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rfcs/pull/2522#issuecomment -412577175

์ฒ˜์Œ์—๋Š” futures-rs ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” .

ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ๋ฌธ์ œ: https://github.com/rust-lang/rust/issues/53447

๋ฉฐ์น  ์ „ discord์—์„œ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด await ๋Š” ์•„์ง ํ‚ค์›Œ๋“œ๋กœ ์˜ˆ์•ฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 2018 ๋ฆด๋ฆฌ์Šค ์ „์— ์ด ์˜ˆ์•ฝ์„ 2018 ์—๋””์…˜ ํ‚ค์›Œ๋“œ lint์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์•ฝ์ด ์•ฝ๊ฐ„ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

Future/Task API์— ๋กœ์ปฌ future๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
SpawnLocalObjError ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@panicbit ์ž‘์—… ๊ทธ๋ฃน์—์„œ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์— ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•œ์ง€ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang-nursery/wg-net/issues/56

( SpawnLocalObjError ์€ ์™„์ „ํžˆ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค: LocalPool of the futures crate๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ libcore์˜ ์–ด๋–ค ๊ฒƒ๋„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ๋งž์Šต๋‹ˆ๋‹ค)

@withoutboats ๋ฌธ์ œ ์„ค๋ช…์— ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋งํฌ๊ฐ€ https://github.com/rust-lang/rfcs/pull/2418 ์ด ๋‹ซํžˆ๊ณ  https://github.com/rust-lang-nursery/futures-rs/issues/1199 ๊ฐ€ . /github.com/rust-lang/rust/issues/53548

์ฃผ์˜ ์ด ์ถ”์  ๋ฌธ์ œ์˜ ์ด๋ฆ„์€ async/await์ด์ง€๋งŒ ์ž‘์—… API์—๋„ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค! ์ž‘์—… API์—๋Š” ํ˜„์žฌ ์•ˆ์ •ํ™” RFC๊ฐ€ ๋ณด๋ฅ˜ ์ค‘์ž…๋‹ˆ๋‹ค. https://github.com/rust-lang/rfcs/pull/2592

๋Œ€์ฒด ๋น„๋™๊ธฐ ๊ตฌํ˜„์„ ์œ„ํ•ด ํ‚ค์›Œ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ๋Š” Future๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ๋ฅผ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค ๊ธฐํšŒ๋ฅผ ๋†“์นœ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@aep oneshot::channel ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ํ’€ ๊ธฐ๋ฐ˜ Future ์‹œ์Šคํ…œ์œผ๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด JavaScript Promises๋Š” ํ‘ธ์‹œ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ stdweb ์€ oneshot::channel ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JavaScript Promises๋ฅผ Rust Futures๋กœ ๋ณ€ํ™˜ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ oneshot::channel ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ์ฝœ๋ฐฑ API์— setTimeout ํ•ฉ๋‹ˆ๋‹ค.

Rust์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ ๋•Œ๋ฌธ์— push ๊ธฐ๋ฐ˜ Futures๋Š” pull์— ๋น„ํ•ด ์ถ”๊ฐ€ ์„ฑ๋Šฅ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ์ „์ฒด Future ์‹œ์Šคํ…œ์„ ํ‘ธ์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ•„์š”ํ•  ๋•Œ๋งŒ ์„ฑ๋Šฅ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์˜ˆ: oneshot::channel ).

๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ, ์ €๋Š” ์ฝ”์–ด ํŒ€์ด๋‚˜ ๋žญ ํŒ€์˜ ์ผ์›์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ œ๊ฐ€ ๋งํ•˜๋Š” ์–ด๋–ค ๊ฒƒ๋„ ๊ถŒ์œ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ œ ๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค๊ฐ€ ์ œํ•œ๋œ ์ฝ”๋“œ์—์„œ๋Š” ์‹ค์ œ๋กœ ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. pull ๋ชจ๋ธ์€ ๋Œ€๊ธฐ ํ•จ์ˆ˜ ์Šคํƒ์„ ํ†ตํ•ด ๋‹ค์Œ ์ค€๋น„ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹  ๋Œ์–ด์˜ค๋Š” ๊ฒƒ ๋‚ด๋ถ€์— ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒจ๋„ํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. future.rs ๋””์ž์ธ์€ ๋„คํŠธ์›Œํฌ ์Šค์œ„์น˜(๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€) ๋˜๋Š” ๊ฒŒ์ž„ ๋ Œ๋”๋Ÿฌ์™€ ๊ฐ™์ด ํ•˜๋“œ์›จ์–ด์— ๊ฐ€๊นŒ์šด ๋ชจ๋“  ๊ฒƒ์— ๋„ˆ๋ฌด ๋น„์Œ‰๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ์— ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ ๊ฒƒ์€ Generator๊ฐ€ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด์ „์— ๋งํ–ˆ๋“ฏ์ด ๋‘ ๊ฐœ์˜ ํ‚ค์›Œ๋“œ๋ฅผ ๋‹จ์ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋Œ€์‹  ์ถฉ๋ถ„ํžˆ ์ถ”์ƒํ™”ํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฐ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์‹ค์ œ๋กœ ๋™์ผํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ์— ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ ๊ฒƒ์€ Generator๊ฐ€ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ async ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๋ฆฌํ„ฐ๋Ÿด์„ ๋‘˜๋Ÿฌ์‹ผ ์ตœ์†Œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ IO๋ฅผ ์–ด๋–ป๊ฒŒ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค CPS ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

"๋Œ์–ด๋‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ ๋‚ด๋ถ€์— ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ๋ง์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์™œ ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ๋˜๋Š” "๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜ ์Šคํƒ์„ ํ†ตํ•ด ๋‹ค์Œ ์ค€๋น„ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ"์ด poll() ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ์„ ๋ฌผ์ด ๋” ๋น„์‹ธ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค). ์ž„์˜์˜ ์ฝœ๋ฐฑ์ด future์— ์—ฐ๊ฒฐ๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋ ค๋ฉด ์ผ์ข…์˜ ๊ฐ„์ ‘ ์ฐธ์กฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ํž™ ํ• ๋‹น์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฃจํŠธ future์— ํ•œ ๋ฒˆ ํ• ๋‹นํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋“  ๊ฒฐํ•ฉ์ž์—์„œ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ทจ์†Œ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฒฝ์ฃผ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์›์ž์  ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ฝœ๋ฐฑ ์™„๋ฃŒ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์˜คํžˆ๋ ค CPS ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ, ํ˜„์žฌ ์ƒ์„ฑ๊ธฐ ๊ตฌ๋ฌธ์€ ์—ฐ์†์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋น„๋™๊ธฐ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋‹น๊ธฐ๋Š” ๊ฒƒ ๋‚ด๋ถ€์— ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋น„๋™๊ธฐ์‹ ์ž‘๋™ ์ˆœ์„œ๋ฅผ ๋‘ ๋ฒˆ ๋’ค์ง‘๋Š” ๋ฐ ๋น„์šฉ์ด ๋“ ๋‹ค๊ณ  ๋งํ•˜๋Š” ๋”์ฐํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋“œ์›จ์–ด์—์„œ ์„ ๋ฌผ๋กœ ํ•œ ๋ฒˆ, ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด์— ๊ฐ€๊นŒ์šด ์ฝ”๋“œ์—์„œ๋Š” ์ด์ ์ด ์ „ํ˜€ ์—†๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋‹ค๋…€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” ์†Œ์ผ“์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„๋˜์—ˆ์Œ์„ ์•Œ ๋•Œ ํ“จ์ฒ˜ ์Šคํƒ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋Œ€์‹  ์ž ๊ธˆ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋น„์šฉ์ด ์žˆ๋Š” ํ“จ์ฒ˜์— ์‹ค์ œ ์ด๋ฒคํŠธ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์‹คํ–‰ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ํฌ๊ธฐ์™€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฝ”๋“œ ๋ณต์žก์„ฑ.

์ž„์˜์˜ ์ฝœ๋ฐฑ์ด ๋ฏธ๋ž˜์— ์—ฐ๊ฒฐ๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋ ค๋ฉด ์ผ์ข…์˜ ๊ฐ„์ ‘ ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฝœ๋ฐฑ์ด ๋น„์‹ธ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค(์‹คํ–‰ ์†๋„์™€ ๊ด€๋ จ์ด ์—†๋Š” ๋‚ด ํ™˜๊ฒฝ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1MB์ด๋ฏ€๋กœ futures.rs๋Š” ํ”Œ๋ž˜์‹œ์—๋„ ๋งž์ง€ ์•Š์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋™์  ๋””์ŠคํŒจ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฐ์†(ํ˜„์žฌ ์ƒ์„ฑ๊ธฐ ๊ฐœ๋…์˜ ์ ˆ๋ฐ˜ ๊ตฌํ˜„)๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์œผ๋กœ ์ธํ•ด ์ทจ์†Œ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ํ˜ผ๋ž€์„ ๊ฒช๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ฝœ๋ฐฑ์„ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฐ์†์€ ์ •์  ์Šคํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ ํด๋ ˆ์ด ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ํ‘ธ์‹œ ๋˜๋Š” ํ’€์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ๊ธฐ ํŒจํ„ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ฆ‰:

async fn add (a: u32) -> u32 {
    let b = await
    a + b
}

add(3).continue(2) == 5

๋งคํฌ๋กœ๋กœ ๊ณ„์† ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ ํŠน์ • ๊ฐœ๋…์— ์–ธ์–ด ํ‚ค์›Œ๋“œ๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ์€ ๊ธฐํšŒ๋ฅผ ๋†“์นœ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ์†๋„๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ด‘์‚ฐ์—๋Š” ์—†์ง€๋งŒ ์ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1MB์ด๋ฏ€๋กœ future.rs๋Š” ํ”Œ๋ž˜์‹œ์—๋„ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ์˜ ๋ฏธ๋ž˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์˜๋„๋˜์—ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๊นŒ?

ํŽธ์ง‘: ์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‚ด ๋งฅ๋ถ์—์„œ --release๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ 295KB ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ hello world๋Š” 273KB ์ฐจ์ง€).

use futures::{executor::LocalPool, future};

fn main() {
    let mut pool = LocalPool::new();
    let hello = pool.run_until(future::ready("Hello, world!"));
    println!("{}", hello);
}

์‹คํ–‰ ์†๋„๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ด‘์‚ฐ์—๋Š” ์—†์ง€๋งŒ ์ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1MB์ด๋ฏ€๋กœ future.rs๋Š” ํ”Œ๋ž˜์‹œ์—๋„ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ์˜ ๋ฏธ๋ž˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์˜๋„๋˜์—ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๊นŒ?

๋˜ํ•œ ๊ธฐ์–ต์ด๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? 128kB ํ”Œ๋ž˜์‹œ/16kB ๋žจ์ด ์žˆ๋Š” ์žฅ์น˜์—์„œ ํ˜„์žฌ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ async/await์—๋Š” ํ™•์‹คํžˆ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋Š” ๋Œ€๋ถ€๋ถ„ ๊ตฌํ˜„ ๋ฌธ์ œ์ด๋ฉฐ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: https://github.com/rust-lang/rust/issues/52924).

์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” ์†Œ์ผ“์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ค€๋น„๋˜์—ˆ์Œ์„ ์•Œ ๋•Œ ํ“จ์ฒ˜ ์Šคํƒ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋Œ€์‹  ์ž ๊ธˆ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋น„์šฉ์ด ์žˆ๋Š” ํ“จ์ฒ˜์— ์‹ค์ œ ์ด๋ฒคํŠธ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์‹คํ–‰ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ํฌ๊ธฐ์™€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฝ”๋“œ ๋ณต์žก์„ฑ.

์™œ์š”? ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฏธ๋ž˜๊ฐ€ ๋‹น์‹ ์„ ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ poll ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์–ต์ด๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ „์ฒด ํ† ๋ก ์€ ๋‚ด๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ ์„ ๋ฌดํšจํ™”ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฏธ๋ž˜์˜ ๋””์ž์ธ์„ ํ•ต์‹ฌ ์–ธ์–ด์— ์ง‘์–ด๋„ฃ๋Š” ๊ฒƒ์ด ์‹ค์ˆ˜๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ ์ด์ƒ์„ ๋น„ํŒํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ œ ์š”์ ์€ async ํ‚ค์›Œ๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด ๋ฏธ๋ž˜์— ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ์—ฐ์†์ด์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋‚˜์€ ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘ธ์‹œ ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ poll์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, Future:poll ์— ํ˜ธ์ถœ ์ธ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ฌธ ์กฐ์‚ฌ๋Š” ์ถ”์ƒ์ ์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  async ํ‚ค์›Œ๋“œ์—์„œ ์—ฐ์†์„ ๋‚ด๋ณด๋‚ด๊ณ  ์ธ์ˆ˜๊ฐ€ 0์ธ Continuation์— ๋Œ€ํ•ด Future๋ฅผ impl ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋ฏธ๋ž˜์— ๋น„์šฉ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์ง€๋งŒ ํ˜„์žฌ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๋…ธ๋ ฅ์ด ์ ๊ฒŒ ๋“œ๋Š” ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ continations๋Š” ๋ฌผ๋ก  ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ desugar๋Š” ์ ์ ˆํ•œ ์—ฐ์†๋ณด๋‹ค ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ํ์‡„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@aep ํ‚ค์›Œ๋“œ( async ๋ฐ await )๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@Centril ๋‚ด ์ˆœ์ง„ํ•œ ๋น ๋ฅธ ์ˆ˜์ •์€ ๋น„๋™๊ธฐ๋ฅผ Future๊ฐ€ ์•„๋‹Œ Generator๋กœ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๋…์ ์ ์ธ ๋ฐฑ์—”๋“œ๊ฐ€ ๋˜๊ธฐ๋ณด๋‹ค๋Š” ์ ์ ˆํ•œ ์—ฐ์†์„ฑ์„ ์œ„ํ•ด ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค ์‹œ๊ฐ„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

10์ค„ PR๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฒŒ์ง‘๊ณผ ์‹ธ์šธ ์ธ๋‚ด์‹ฌ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ์˜ ์„คํƒ•์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์ „ ์ ˆ์ฐจ๋ฅผ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋น„๋™๊ธฐ ํ•ญ๋ชฉ์„ ๋”ฐ๋ฅด์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ์ „์— / ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜ ๋œ ๊ฒฝ์šฐ ์‚ฌ๊ณผํ•˜์ง€๋งŒ no_std ์—์„œ async / await๋ฅผ ์ง€์›ํ•˜๊ธฐ์œ„ํ•œ (๊ตฌํ˜„) ๊ณ„ํš์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

AFAICT ํ˜„์žฌ ๊ตฌํ˜„์€ TLS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Waker๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ no_std / core ์—๋Š” TLS(๋˜๋Š” ์Šค๋ ˆ๋“œ) ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค. @alexcrichton ์œผ๋กœ๋ถ€ํ„ฐ Generator.resume ๊ฐ€ ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ง€์›์„ ์–ป๋Š” ๊ฒฝ์šฐ TLS๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

no_std ์ง€์›์ด ๊ตฌํ˜„๋  ๋•Œ async/await์˜ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด std async / await on stable์„ ์ถœ์‹œํ•˜๋„๋ก ์•ˆ์ •ํ™”๋  ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  no_std ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ?

@japaric poll ์ด์ œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. AFAIK, TLS๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://doc.rust-lang.org/nightly/std/future/trait.Future.html#tymethod.poll

ํŽธ์ง‘: async/await์—๋Š” ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ๋ฏธ๋ž˜์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

[...] std async / await on stable์„ ๋ฐฐ์†กํ•˜๋„๋ก ์•ˆ์ •ํ™”๋  ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  no_std ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ฏฟ๋Š”๋‹ค. ๊ด€๋ จ ๋ถ€๋ถ„์€ std::future ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋ชจ๋‘ ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์„ ์ถ”๊ฐ€ gen_future ๋ถˆ์•ˆ์ •ํ•œ ๊ธฐ๋Šฅ ๋’ค์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. async ๋ณ€ํ™˜์€ set_task_waker ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊นจ์šฐ๊ธฐ๋ฅผ TLS์— ์ €์žฅํ•˜๊ณ  await! ๋Š” poll_with_tls_waker ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ์žฌ๊ฐœ ์ธ์ˆ˜ ์ง€์›์„ ๋ฐ›์œผ๋ฉด ๋Œ€์‹  async ๋ณ€ํ™˜์ด ๊นจ์šฐ๊ธฐ๋ฅผ ์žฌ๊ฐœ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ  await! ๋Š” ์ธ์ˆ˜์—์„œ ์ด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ธ์ˆ˜๊ฐ€ ์—†์–ด๋„ ๋น„๋™๊ธฐ ๋ณ€ํ™˜์—์„œ ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•œ ์ฝ”๋“œ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์ถ”๊ฐ€๋œ ์ƒ์„ฑ๊ธฐ ์ธ์ˆ˜๋ฅผ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ TLS ์š”๊ตฌ ์‚ฌํ•ญ์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

@japaric ๊ฐ™์€ ๋ฐฐ. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž„๋ฒ ๋””๋“œ์—์„œ ๋ฏธ๋ž˜ ์ž‘์—…์„ ํ–ˆ๋‹ค๊ณ  ํ•ด๋„ ๋ชจ๋‘ Tier3์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.

async: weave in the Arc๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์ ์€ ์ž‘์—…์ด ํ•„์š”ํ•œ ์ถ”์•…ํ•œ ํ•ดํ‚น์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์Šคํƒ์„ ํ†ตํ•ด

  1. "Poll"์ธ์ˆ˜ ์ฐธ์กฐ https://github.com/aep/osaka/blob/master/osaka-dns/src/lib.rs#L76 Arc
  2. 87๋ฒˆ ๋ผ์ธ์—์„œ ํˆฌํ‘œ์— ๋ฌด์–ธ๊ฐ€ ๋“ฑ๋กํ•˜๊ธฐ
  3. ์ค„ 92์—์„œ ์—ฐ์†์ ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด yield
  4. ์ƒ์„ฑ๊ธฐ์—์„œ ์ƒ์„ฑ๊ธฐ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ผ์ธ 207์—์„œ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์Šคํƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. ๋งˆ์ง€๋ง‰์œผ๋กœ 215ํ–‰์—์„œ โ€‹โ€‹๋Ÿฐํƒ€์ž„์„ ์ „๋‹ฌํ•˜์—ฌ ์ „์ฒด ์Šคํƒ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” Future๊ฐ€ ์•„๋‹Œ "์ˆœ์ˆ˜ํ•œ" ํด๋กœ์ € ์Šคํƒ์œผ๋กœ ๋น„๋™๊ธฐ๋ฅผ ๋‚ฎ์ถ”๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ๊ฐ€์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆœ์ˆ˜ํ•˜์ง€ ์•Š์€ ํ™˜๊ฒฝ์„ ๋ฃจํŠธ์˜ ์ธ์ˆ˜๋กœ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ ˆ๋ฐ˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

https://twitter.com/arvidep/status/1067383652206690307

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์œ ์ผํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ธ์ž๊ฐ€ ์—†๋Š” TLS-less async/await๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์ƒ๊ฐ์„ ๋ฉˆ์ถœ ์ˆ˜๊ฐ€ ์—†์–ด์„œ no_std proc-macro ๊ธฐ๋ฐ˜ async_block! / await! ๋งคํฌ๋กœ ์Œ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ์˜ TLS ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์ด๋‚˜ ์ƒ์„ฑ๊ธฐ ์ธ์ˆ˜ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜(์ ์–ด๋„ ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ ์ธ์ˆ˜๊ฐ€ ๊ฑด์ „ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ)๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ฏธ๋ฌ˜ํ•œ ์•ˆ์ „ ๋ณด์žฅ์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ฑด์ „ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค(์•„๋ฌด๋„ ์—†๋Š” ํ•œ ๋‚ด๊ฐ€ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋‹ค์†Œ ํฐ ์œ„์ƒ ๊ตฌ๋ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์—†๋Š” gensym idents๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณ€ํ™˜๊ณผ await ๋งคํฌ๋กœ ์‚ฌ์ด์—์„œ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด ๊ตฌํ˜„์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

OP์—์„œ await! ์„ std ์—์„œ core ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ #56767์ด ์ถ”์  ์•ˆ์ •ํ™” ์ „์— ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ ๋ชฉ๋ก์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ.

@Nemo157 await! ๊ฐ€ ์•ˆ์ •ํ™” ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์–ด์จŒ๋“  ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@Centril ๋ˆ„๊ฐ€ await! ์ด ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... :wink:

@cramertj ๊ทธ๋Š” ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ํ‚ค์›Œ๋“œ ๋ฒ„์ „์ด ์•„๋‹Œ ๋งคํฌ๋กœ ๋ฒ„์ „์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค ...

@crlf0710 ์•”์‹œ์  ๋Œ€๊ธฐ/๋ช…์‹œ์  ๋น„๋™๊ธฐ ๋ธ”๋ก ๋ฒ„์ „์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@crlf0710 ์ €๋„ ๊ทธ๋žฌ์–ด์š” :)

@cramertj ํ˜„์žฌ await ๋ฐ await! ๋‘˜ ๋‹ค์˜ ์กด์žฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ถ”์•…ํ•œ ํ•ดํ‚น์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งคํฌ๋กœ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋งคํฌ๋กœ๋ฅผ ์•ˆ์ •ํ™”ํ•˜๋ฉด ์ ˆ๋Œ€ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@stjepang ์ €๋Š” ์ ‘๋ฏธ์‚ฌ ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์„ ํ˜ธ๋„์™€ ๋ชจํ˜ธ์„ฑ ๋ฐ ๋ฐœ์Œํ•  ์ˆ˜ ์—†๋Š”/Google์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ธฐํ˜ธ๋ฅผ ์‹ซ์–ดํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” await! ์˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ๋„ ๊ทธ๋‹ค์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํ˜„์žฌ ์ œ์•ˆ(์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ? )์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • await!(x)? (์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ)
  • await x? ( await ๋Š” ? ๋ณด๋‹ค ๋” ๋‹จ๋‹จํ•˜๊ฒŒ ๋ฐ”์ธ๋“œํ•˜๊ณ , ์—ฌ์ „ํžˆ ์ ‘๋‘์‚ฌ ํ‘œ๊ธฐ๋ฒ•, ์ฒด์ธ ๋ฉ”์„œ๋“œ์— ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•จ)
  • await {x}? (์œ„์™€ ๋™์ผํ•˜์ง€๋งŒ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ์ผ์‹œ์ ์œผ๋กœ {} ํ•„์š”)
  • await? x ( await ๋œ ๋‹จ๋‹จํžˆ ๋ฌถ๊ณ , ์—ฌ์ „ํžˆ ์ ‘๋‘์‚ฌ ํ‘œ๊ธฐ๋ฒ•, ์ฒด์ธ ๋ฉ”์„œ๋“œ์— ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•จ)
  • x.await? (ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค)
  • x# / x~ /etc. (์ผ๋ถ€ ์ƒ์ง•)
  • x.await!()? (์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์Šคํƒ€์ผ, @withoutboats ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์•„๋‹Œ ์œ ํ˜• ๊ธฐ๋ฐ˜ ํŒŒ๊ฒฌ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด . ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ํŒฌ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. )

๋ฐฐ์†กํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ await!(x) , un-keyword-ify await , ๊ฒฐ๊ตญ ์–ธ์  ๊ฐ€๋Š” x.await!() ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ›„์œ„ ๋งคํฌ๋กœ์˜ ์žฅ์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์„ ํŒ๋งคํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์•„์ฃผ ๋Š์Šจํ•˜๊ฒŒ ๋”ฐ๋ฅด์ง€๋งŒ, ์ œ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” await! ๋งคํฌ๋กœ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค: https://blag.nemo157.com/2018/12/09/inside-rusts-async-transform.html

์–ด๋–ค ์ข…๋ฅ˜์˜ ๋งˆ๋ฒ•์ด๋‚˜ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค. ๋” ์ ์€ ๊ฒƒ์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ Try ์•„์ง ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— try! ๋„ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await!(x)? ๋Š” ์„คํƒ•๊ณผ ๋ช…๋ฐฑํ•œ ๋ช…๋ช…๋œ ์ž‘์—… ์‚ฌ์ด์˜ ์ ์ ˆํ•œ ์ ˆ์ถฉ์•ˆ์ด๋ฉฐ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋””๋ฒ„๊ทธ ์ถ”์ ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋งคํฌ๋กœ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œํŽธ async / yield ๋Š” ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ "๊ทธ๋ƒฅ" ๊ตฌ๋ฌธ ์„คํƒ•์ž…๋‹ˆ๋‹ค. JavaScript๊ฐ€ async/await ์ง€์›์„ ๋ฐ›๊ณ  ์žˆ์—ˆ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์„ฑ๊ธฐ์™€ Promises/Futures๋ฅผ ๋น„๋™๊ธฐ ์ž‘์—…์— ์‚ฌ์šฉํ•˜๋„๋ก ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•œ Babel ๋ฐ Regenerator ์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์—ˆ๋˜ ์‹œ์ ˆ์ด ์ƒ๊ฐ๋‚ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ๋ฐ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ด ๋˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋ฉฐ ์ž ์žฌ์ ์œผ๋กœ ์„œ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค( Stream ). await! ๋ฅผ yield ๋กœ ๋‚ฎ์ถ”๋Š” ๋งคํฌ๋กœ๋กœ ๋‚จ๊ฒจ๋‘๋Š” ๊ฒƒ์€ ์˜๊ตฌ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ ค! ์ˆ˜์œจ์„ ๋‚ฎ์ถ”๋Š” ๋งคํฌ๋กœ๋Š” ์˜๊ตฌ์ ์ธ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

yield ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ์˜๊ตฌ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํ™•์‹คํžˆ ๊ทธ๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์† ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. async + generators = Stream ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ yield Poll::Pending; ๋Œ€ yield Poll::Ready(next_value) ์™€ ๊ฐ™์ด ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ๋ฐ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ด ๋˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž„์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค.

๋น„๋™๊ธฐ์™€ ์ƒ์„ฑ๊ธฐ ๋Š” ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๊นŒ? ๋ฌผ๋ก  ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์„ JavaScript๊ฐ€ ์ˆ˜ํ–‰ํ•œ ๋ฐฉ์‹๊ณผ ๋‹ค์‹œ ๋น„๊ตํ•˜๋ฉด์„œ ์ €๋Š” ํ•ญ์ƒ ๋น„๋™๊ธฐ๊ฐ€ ์ƒ์„ฑ๊ธฐ ์œ„์— ๊ตฌ์ถ•๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ผ๋ฐ˜ ๊ฐ’๊ณผ โ€‹โ€‹๋ฐ˜๋Œ€๋กœ Future ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‚ฐ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰์ž๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ํ‰๊ฐ€ํ•˜๊ณ  ๋Œ€๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‚ด๊ฐ€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ํ‰์ƒ ๋ฌผ๊ฑด.

์‚ฌ์‹ค, ๋‚˜๋Š” ํ•œ ๋ฒˆ ์ด ์ •ํ™•ํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฅผ

@cramertj ๋‘ ๊ฐ€์ง€๊ฐ€ ๋ณ„๊ฐœ์˜ "ํšจ๊ณผ"๋ผ๋ฉด ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: https://internals.rust-lang.org/t/pre-rfc-await-generators-directly/7202. ์šฐ๋ฆฌ๋Š” yield Poll::Ready(next_value) ๋ฅผ ์›ํ•˜์ง€ ์•Š๊ณ  yield next_value ๋ฅผ ์›ํ•˜๊ณ  ๋™์ผํ•œ ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ๊ณณ์— await ๊ฐ–์Šต๋‹ˆ๋‹ค.

@rpjohnst

์šฐ๋ฆฌ๋Š” Poll::Ready(next_value)๋ฅผ ์‚ฐ์ถœํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ณ  next_value๋ฅผ ์‚ฐ์ถœํ•˜๊ณ  ๋™์ผํ•œ ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ await๋ฅผ ๊ฐ–๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ๋ฌผ๋ก  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋””์Šˆ๊ฐ€๋ง์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด yield ๋ฅผ Poll::Ready ๋กœ ๊ฐ์‹ธ๊ณ  Poll::Pending ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. yield ์ƒ์„ฑ๋œ await! . ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๊ตฌ๋ฌธ์ƒ ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ตฌํ˜„์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@cramertj ๋˜ํ•œ ์ด๊ฒƒ:

  • await? x

@novacrazy ์˜ˆ, ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ํ•จ๊ป˜ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ JavaScript ์—์„œ๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

https://thenewstack.io/whats-coming-up-in-javascript-2018-async-generators-better-regex/

"๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ์™€ ๋ฐ˜๋ณต๊ธฐ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ๋ฐ˜๋ณต๊ธฐ๋ฅผ ๊ฒฐํ•ฉํ•  ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ ๋˜๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๊ทธ๋Š” ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ECMAScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–‘๋ณดํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘˜ ๋‹ค ํ•  ์ˆ˜๋Š” ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. "์ด๋Š” ํŠนํžˆ ์ŠคํŠธ๋ฆผ์„ ๋…ธ์ถœํ•˜๋Š” Fetch ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํ”Œ๋žซํผ์˜ ์ผ๋ถ€๊ฐ€ ๋˜๊ณ  ์žˆ๋Š” ์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ํ•˜๋Š” ๋ฐ ์ •๋ง ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค."

async iterator๋Š” Observable ํŒจํ„ด๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค. โ€œObservable์€ ํ‘ธ์‹œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ ๊ตฌ๋…ํ•˜๋ฉด ์ค€๋น„ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ตœ๊ณ  ์†๋„๋กœ ์ด๋ฒคํŠธ์™€ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋˜๋ฏ€๋กœ ์ฑ„ํŒ…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํผ๋ง ๋˜๋Š” ์ƒ˜ํ”Œ๋ง ์ „๋žต์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.โ€๋ผ๊ณ  Terlson์ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. async iterator๋Š” push-pull ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ๊ฐ’์„ ์š”์ฒญํ•˜๋ฉด ๊ฐ’์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋„คํŠธ์›Œํฌ IO ๊ธฐ๋ณธ ํ˜•์‹๊ณผ ๊ฐ™์€ ์ž‘์—…์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

@Centril ok, ์—ด๋ฆผ #56974, OP์— ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์œผ๋กœ ์ถ”๊ฐ€๋  ๋งŒํผ ์ •ํ™•ํ•ฉ๋‹ˆ๊นŒ?


await ๊ตฌ๋ฌธ์œผ๋กœ ๋‹ค์‹œ ๊ฐ€๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ์ ์–ด๋„ ํ•œ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ์‘๋‹ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” await! ๋งคํฌ๋กœ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค: https://blag.nemo157.com/2018/12/09/inside-rusts-async-transform.html

๋˜ํ•œ ๋งคํฌ๋กœ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ตฌํ˜„๋œ ๋งคํฌ๋กœ๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ„์† ๋งคํฌ๋กœ๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ฌด์‹œ). ์ด์œ ๋ฅผ ํ™•์žฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์— ๋”ฐ๋ฅด๋ฉด ํ˜„์žฌ || await!() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฉด์„œ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์ˆจ๊น๋‹ˆ๋‹ค.
  2. @cramertj์ด ์–ธ๊ธ‰์œผ๋กœ, ๋ฐœ์ „๊ธฐ ๋น„๋™๊ธฐ ์ง€์›ํ•˜๋ฉด ๊ตฌ๋ณ„์ด ํ•„์š”ํ•œ yield ์˜ ์ถ”๊ฐ€ await ๋‹ค๋ฅธ yield ์˜ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ž‘์„ฑ๋œ. ์ด๊ฒƒ์€ ์‚ฌ์ „ ๋งคํฌ๋กœ ํ™•์žฅ ๋‹จ๊ณ„๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ _๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. _if_ ์‚ฌ์šฉ์ž๋Š” ๋งคํฌ๋กœ ๋‚ด๋ถ€์—์„œ yield ์›ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ yield_from! ์™€ ๊ฐ™์€ ๋งคํฌ๋กœ ๋‚ด๋ถ€ ๊ตฌ์กฐ์—๋Š” ๋งค์šฐ ์œ ์šฉํ•œ yield . . ๋งคํฌ๋กœ์—์„œ yield ๊ฐ€ ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด await! ๋Š” ์ตœ์†Œํ•œ ๋‚ด์žฅ ๋งคํฌ๋กœ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ ๊ตฌ๋ฌธ์ด ์•„๋‹Œ ๊ฒฝ์šฐ).
  3. async fn ์—์„œ no_std ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘ async fn -created- Future ๋ฐ await ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๊นจ์šฐ๊ธฐ๊ฐ€ ์ €์žฅ๋œ ์‹๋ณ„์ž๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ตฌํ˜„๋˜๋Š” ๊ฒฝ์šฐ ์ด ๋‘ ์œ„์น˜ ๊ฐ„์— ์œ„์ƒ์ ์œผ๋กœ ์•ˆ์ „ํ•œ ์‹๋ณ„์ž๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. yield ํ˜ธ์ถœ ์ฃผ๋ณ€์˜ ๋ž˜ํผ๋กœ await! ๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ๊ฐ€์‹œ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์˜๋„๋Š” ๊ฒฐ์ฝ” ์•„๋‹™๋‹ˆ๋‹ค. await! ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์˜ ๋ฏธ๋ž˜๋Š” ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› compile_error! , assert! , format_args! ๋“ฑ๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์€ ๊ตฌํ˜„์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ฝ”๋“œ๋กœ ๋””์Šˆ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ดํ•ดํ•ด์•ผ ํ•  ์œ ์ผํ•œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์•ˆ๋œ ๊ตฌ๋ฌธ ๊ฐ„์— ์˜๋ฏธ ์žˆ๋Š” ์˜๋ฏธ ์ฐจ์ด๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ง€ ํ‘œ๋ฉด ๊ตฌ๋ฌธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

await ๊ตฌ๋ฌธ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋Œ€์•ˆ์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„  await ๋ฅผ ํ›„์œ„ ์—ฐ์‚ฐ์ž๋กœ ๋„ฃ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ expression.await ๋Š” ์ด๋ฏธ ์ง€์ ํ–ˆ๋“ฏ์ด ํ•„๋“œ์™€ ๋„ˆ๋ฌด ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ ์ œ์•ˆ์€ expression awaited ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹จ์ ์€ awaited ๊ฐ€ ์•„์ง ํ‚ค์›Œ๋“œ๋กœ ์œ ์ง€๋˜์ง€ ์•Š์ง€๋งŒ ์˜์–ด์—์„œ๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฌ์šฐ๋ฉด์„œ๋„ ๊ทธ๋Ÿฐ ํ‘œํ˜„์€ ์—†์Šต๋‹ˆ๋‹ค( expression [token] ์™€ ๊ฐ™์€ ๋ฌธ๋ฒ• ํ˜•์‹)๋Š” Rust์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ง€๊ธˆ, ์ด๊ฒƒ์ด ์ •๋‹นํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ์“ธ ์ˆ˜ expression? awaited ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด Result<Future,_> , ๊ทธ๋ฆฌ๊ณ  expression awaited? ๋Œ€๊ธฐํ•˜๋Š” Future<Item=Result<_,_>> .

@earthengine

๋‚˜๋Š” awaited ํ‚ค์›Œ๋“œ์— ๋งค์ง„๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‹น์‹ ์€ ๋ญ”๊ฐ€์— ๋น ์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ ํ†ต์ฐฐ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. yield ๋ฐ await ๋Š” return ๋ฐ ? .

return x ๋ฐ˜ํ™˜ ๊ฐ€์น˜ x ํ•˜๋ฉด์„œ, x? ๋žฉ ํ•ด์ œ์˜ ์›์ธ์ด x ๊ฐ€ ์žˆ๋‹ค๋ฉด ์กฐ๊ธฐ ๋ฐ˜ํ™˜ Err .
yield x ์ˆ˜์ต๋ฅ ์€ ๊ฐ€์น˜ x , ๋™์•ˆ x awaited ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋ฏธ๋ž˜ x , ๊ทธ๊ฒƒ์˜ ๊ฒฝ์šฐ ์กฐ๊ธฐ ๋ฐ˜ํ™˜ Pending .

๊ฑฐ๊ธฐ์— ๋ฉ‹์ง„ ๋Œ€์นญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ await ์‹ค์ œ๋กœ ํ›„์œ„ ์—ฐ์‚ฐ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

let x = x.do_something() await.do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;

๋‚˜๋Š” @cramertj๊ฐ€ ๋ฐฉ๊ธˆ ๋ณด์—ฌ์ค€ ์ •ํ™•ํ•œ ์ด์œ  ๋•Œ๋ฌธ์— await! / await ์™€ ๊ฐ™์€ ์ค‘์ฒฉ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ? ์˜ ๋‹จ์ˆœํ•จ์ด ์—†๊ณ  ํ›„์œ„ ์—ฐ์‚ฐ์ž์— ์‚ฌ์šฉํ•  ๊ธฐํ˜ธ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค...

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ์•ž์—์„œ ์„ค๋ช…ํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ await! ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ Rust-yํ•˜๊ณ  ๋ง๋„ ์•ˆ๋˜๋Š” ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ๊ธด ํ‘œํ˜„์‹์ด๋‚˜ ์—ฐ๊ฒฐ๋œ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ ์ „๋ฐ˜์ ์ธ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

Rustfmt ํ‘œ์ค€์—์„œ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

let x = x.do_something() await
         .do_another_thing() await;
let x = x.foo(|| ...)
         .bar(|| ...)
         .baz() await;

์ด๊ฒƒ์ด ๊ฐ€๋…์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๊ฑฐ์˜ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” postfix await๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด๋ก€์ ์ด๊ณ  ์ •์‹ ์  ๊ทธ๋ฃน์„ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋‚˜๋Š” ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ .await!() ํ•จ๊ป˜ ์ž˜ ์Œ ๊ฒƒ ? ์ด์ „ ๋˜๋Š” ์ดํ›„ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ”ผํŒ…ํ•˜๊ณ , ! ์ œ์–ด ํ๋ฆ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ—ˆ์šฉํ•œ๋‹ค.

(์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ธ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ .await!() ์žˆ์Šต๋‹ˆ๋‹ค.)

์ €๋Š” await ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋งค์šฐ ์‹ซ์–ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค( . ๋˜๋Š” () ). ํ™•์‹คํžˆ ๋น„์šฉ. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•  ๋น„์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ x await ๋Š” ๋ถ„๋ช…ํžˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‚˜ ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ์•„๋‹ˆ๋ฉฐ( x.await / x.await() / await(x) ๋ชจ๋‘ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ) ํŽ‘ํ‚ค๊ฐ€ ๋” ์ ์Šต๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ๋ฌธ์ œ. ์ด ๊ตฌ๋ฌธ์€ ? ๋ฐ ๋ฉ”์„œ๋“œ ์•ก์„ธ์Šค ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: foo await? ๋ฐ foo? await foo await?.x ๋ฐ foo await?.y foo await?.x ๋ฐ foo await?.y ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘˜ ๋‹ค ๋‚˜์—๊ฒŒ ๋ช…ํ™•ํ•œ ์šฐ์„  ์ˆœ์œ„ ์ˆœ์„œ ์ง€์ •).

๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค

stream.for_each(async |item| {
    ...
}) await;

๋ณด๋‹ค ์ž˜ ์ฝํžŒ๋‹ค

await!(stream.for_each(async |item| {
    ...
});

๋Œ€์ฒด๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ง€์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@joshtriplett RE .await!() ์šฐ๋ฆฌ๋Š” ๋ณ„๋„๋กœ ์ด์•ผ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค-- ๋‚˜๋„ ์ฒ˜์Œ์—๋Š” ์ด๊ฒƒ์— ์ฐฌ์„ฑํ–ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋ฉด ์ด๊ฒƒ์„ ์ฐฉ๋ฅ™์‹œ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์— ๋Œ€ํ•œ ์ƒ๋‹นํ•œ ๋ฐ˜๋Œ€ํŒŒ๊ฐ€ ์žˆ๊ณ (๋ถˆํ–‰ํ•œ ์ด์œ ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ฝค ์ข‹์€ ์ผ์ด์ง€๋งŒ) await ์•ˆ์ •ํ™”๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์™œ ๋ชจ๋‘?

macro_rules! await {
    ($e:expr) => {{$e await}}
}

๋‚˜๋Š” ์ด์ œ postfix์˜ ๋งค๋ ฅ์„ ๋” ๋งŽ์ด ๋ณด์•˜๊ณ  ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋” ์ข‹์•„ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์œ„์˜ ์น˜ํŠธ๋Š” ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•ด์„œ Rust ์ž์ฒด์—์„œ ์ œ๊ณตํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ ‘๋ฏธ์‚ฌ์— ๋Œ€ํ•ด +1์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ ‘๋ฏธ์‚ฌ ๋ฒ„์ „ ์™ธ์— ์ ‘๋‘์‚ฌ ๊ธฐ๋Šฅ ๋„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๊ด€ํ•ด์„œ๋Š” .await!() ๊ฐ€ ์œ ์ผํ•˜๊ฒŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด๋ผ๊ณ  ๋งํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ ํ–‰ ๊ณต๋ฐฑ์ด ์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ await ์˜ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํ•œ ์ค„์— ํ•˜๋‚˜์˜ ๋ช…๋ น๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜•์‹์„ ์ง€์ •ํ•˜๋ฉด ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ(์—ฌ์ „ํžˆ ์ด๋ก€์ ์ด์ง€๋งŒ) ๊ฐ„๋‹จํ•œ ๋ช…๋ น๋ฌธ์„ ํ•œ ์ค„์— ํ˜•์‹ํ™”ํ•˜๋ฉด ํ›จ์”ฌ ๋œ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

ํ›„์œ„ ํ‚ค์›Œ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด await ์ ์ ˆํ•œ ๊ธฐํ˜ธ ์—ฐ์‚ฐ์ž๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์ง€๊ธˆ, ์šฐ๋ฆฌ๋Š” ํ›„์œ„ ์—ฐ์‚ฐ์ž๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ASCII ๋ฌธ์ž๋กœ ๋œ ์—ฐ์‚ฐ์ž๊ฐ€ ๋ถ€์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ป์Šต๋‹ˆ๊นŒ

let x = do_something()โŒ›.do_somthing_else()โŒ›;

ํ‰๋ฒ”ํ•œ ASCII๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‚˜๋Š” (์œ„์˜ ๋ชจ์–‘์—์„œ ์˜๊ฐ์„ ์–ป์–ด) ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค.

let x = do_something()><.do_somthing_else()><;

๋˜๋Š” (์ˆ˜ํ‰ ์œ„์น˜์˜ ์‹œ๋ฎฌ๋ ˆ์ดํŠธ)

let x = do_something()>=<.do_somthing_else()>=<;

๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” await ๊ตฌ์กฐ์ฒด๋ฅผ ๋Œ€๊ด„ํ˜ธ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

let x = >do_something()<.>do_something_else()<;

์ด๋Ÿฌํ•œ ๋ชจ๋“  ASCII ์†”๋ฃจ์…˜์€ <..> ๊ฐ€ ์ด๋ฏธ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ณ  < ๋ฐ > ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋™์ผํ•œ ์ „๋‹ฌ ๋ฌธ์ œ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ >< ๋˜๋Š” >=< ๋Š” ์—ฐ์‚ฐ์ž ๋‚ด๋ถ€์— ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์œ„์น˜์— ์—ด๋ ค ์žˆ๋Š” < ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์‚ฌ์ด์˜ ๊ณต๋ฐฑ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ ์—ฐ์‚ฐ์ž๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let x = do_something()-await.do_something_else()-await;

๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ์ ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋‚˜ ์š”์ ์„ ์ ์ ˆํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ค์šด ์ฃผ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ด์œ ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ด๊ณ  ๊ทธ๊ฒƒ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์ฝ๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ค์šธ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(ํŠนํžˆ ๋…น์Šฌ๊ธฐ ์‹œ์ž‘ํ•œ ์‹ ๊ทœ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ). ์‹ค์ œ๋กœ ์ฐจ์ด๊ฐ€ ์žˆ๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ฝ”๋“œ ์„คํƒ•์€ ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๊ณ  ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

@goffrie ์˜ˆ, ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹จ์ง€ ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ์ œ์•ˆํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํ•˜๋‚˜๋งŒ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€, await! ๋งคํฌ๋กœ์˜ ๊ด€์ ์—์„œ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋“ค ์ž์‹ ์˜ ๋งคํฌ๋กœ๋ฅผ ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์€ ์—†์œผ๋ฉฐ, Rust๋Š” ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋ฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ"์€ ๋ถˆ๊ฐ€ํ”ผํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋ณด์—ฌ๋“œ๋ฆฐ ๋‹จ์ˆœํ•œ ๋ฉ์ฒญํ•œ ๋งคํฌ๋กœ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ ‘๋‘์–ด๋“  ์ ‘๋ฏธ์‚ฌ๋“  ํ‚ค์›Œ๋“œ๋Š” ํ•จ์ˆ˜์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ ๋งคํฌ๋กœ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์กด์žฌํ•  ๋•Œ๋งˆ๋‹ค ์•„๋งˆ๋„ ์ ‘๋ฏธ์‚ฌ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๋งคํฌ๋กœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await ๋Œ€ํ•ด ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๋งคํฌ๋กœ๋ฅผ ์„ ํƒํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋งคํฌ๋กœ๋กœ ๋ฐ˜์ „๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ •๋ง ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ ์—ฐ์„ฑ๊ณผ ํ˜•์‹์— ์ค‘์ ์„ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

๊ฒŒ๋‹ค๊ฐ€, ๋น„๋ก ์ด ์งง์€ ์‹œ๊ฐ„์— ๋‚ด๊ฐ€ postfix ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์— ์ง‘์ฐฉํ•˜๊ฒŒ ๋˜์—ˆ์ง€๋งŒ, await ๋Š” ์•„๋งˆ๋„ ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ yield ๋Œ€ํ•ด ๊ฒฐ์ •๋œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฏธ๋Ÿฌ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ›„์œ„ ์†”๋ฃจ์…˜์„ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๋งคํฌ๋กœ๊ฐ€ ๊ฒฐ๊ตญ์—๋Š” ์กด์žฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ฒฐ๋ก ์€ ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ await ๊ฐ€ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ด๋ฉฐ ์•„๋งˆ๋„ ์ผ๋ฐ˜ ์ƒ์ž์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ await! ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ๋ฏธ๋ž˜์—๋Š” ์ ‘๋ฏธ์‚ฌ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ .await!() ๋งคํฌ๋กœ.

@novacrazy

๊ฒŒ๋‹ค๊ฐ€, ๋น„๋ก ์ด ์งง์€ ์‹œ๊ฐ„์— ๋‚ด๊ฐ€ postfix ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์— ์ง‘์ฐฉํ•˜๊ฒŒ ๋˜์—ˆ์ง€๋งŒ, await ๋Š” ์•„๋งˆ๋„ ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ yield ๋Œ€ํ•ด ๊ฒฐ์ •๋œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฏธ๋Ÿฌ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

yield 42 ํ‘œํ˜„์‹์€ ! ์œ ํ˜•์ธ ๋ฐ˜๋ฉด foo.await ์œ ํ˜•์€ T foo: impl Future<Output = T> ์ž…๋‹ˆ๋‹ค. @stjepang ์€ ์—ฌ๊ธฐ์—์„œ ? ๋ฐ return ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค. await ๋Š” yield .

์™œ ๋ชจ๋‘?

macro_rules! await {
    ($e:expr) => {{$e await}}
}

await ๋Š” true ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋งคํฌ๋กœ ์ด๋ฆ„์„ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค์–‘ํ•œ ์ด์œ ๋กœ ์ €๋Š” await ์ ‘๋‘์‚ฌ๋ฅผ ๋ฐ˜๋Œ€ํ•˜๊ณ  ๋ธ”๋ก ํ˜•์‹ await { ... } ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์ผ๊ด€๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ await (expr?) ์ด์ง€๋งŒ (await expr)? ์›ํ•˜๋Š” await expr? ์˜ ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ผ๋ถ€์—์„œ๋Š” await expr ์™ธ์— await? expr ๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” await? ๋‹จ์œ„์™€ ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋‹นํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋ณต์žก์„ฑ ์˜ˆ์‚ฐ์˜ ๋‚ญ๋น„์ด๋ฉฐ await expr ์— ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋” ์ค‘์š”ํ•œ ๊ฒƒ์€, Rust ์ฝ”๋“œ์™€ ํŠนํžˆ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ ๊ณผ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์˜ ํž˜์— ์ง‘์ค‘๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. await ๊ฐ€ ์ ‘๋‘์–ด์ผ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹จ์ˆœํžˆ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์‹  ์ž„์‹œ let ๋ฐ”์ธ๋”ฉ์„ ๋งŒ๋“ค๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ? ๊ฐ€ ํ›„์œ„์ธ ์ด์œ ์ด๊ณ , ๊ฐ™์€ ์ด์œ ๋กœ await ๋„ ํ›„์œ„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์œ ๊ฒƒ์€ await { ... } ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ rustfmt ์— ๋”ฐ๋ผ ์ผ๊ด€๋˜๊ฒŒ ํ˜•์‹์ด ์ง€์ •๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๋€๋‹ˆ๋‹ค.

    let x = await { // by analogy with `loop`
        foo.bar.baz.other_thing()
    };

์ด๊ฒƒ์€ ์ธ์ฒด๊ณตํ•™์ ์ด์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์˜ ์ˆ˜์ง ๊ธธ์ด๋ฅผ ํฌ๊ฒŒ ๋ถ€ํ’€๋ฆฌ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.


๋Œ€์‹  ? ์™€ ๊ฐ™์ด awaiting ์€ ๋ฉ”์„œ๋“œ ์—ฐ๊ฒฐ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋Š” Rust ์ƒํƒœ๊ณ„์— ์ ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๋ฏธ์‚ฌ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. foo.await!() -- ์ด๊ฒƒ์€ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ›„์œ„ ๋งคํฌ๋กœ์— ์ฐฌ์„ฑ ๊ฐ•ํ•˜๊ฒŒ ํ•ด์š” ๋™์•ˆ, ๋‚˜๋Š”๊ฐ€ ๋™์˜์™€ @cramertj์— https://github.com/rust-lang/rust/issues/50547#issuecomment -454225040 ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ํ›„์œ„์— ํˆฌ์ž…ํ•˜์ง€ ์•Š๋Š” ํ•œ ์šฐ๋ฆฌ๋Š”์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์„œ๋Š” ์•ˆ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งคํฌ๋กœ. ๋‚˜๋Š” ๋˜ํ•œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ๋น„์ผ๋ฅ˜์ ์ธ ๋Š๋‚Œ์„ ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด ๊ตฌ์„ฑ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. foo await -- ์ด๊ฒƒ์€ ๊ทธ๋ฆฌ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ํ›„์œ„ ์—ฐ์‚ฐ์ž( expr op )์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€๋งŒ ์ด ํ˜•์‹์— ๋ญ”๊ฐ€ ๋น ์ง„ ๊ฒƒ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ฆ‰, "๋นˆ" ๋Š๋‚Œ). ๋Œ€์กฐ์ ์œผ๋กœ expr? ? ๋ฅผ expr ์ง์ ‘ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ณต๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ? ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  3. foo.await -- ์ด๊ฒƒ์€ ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ๋น„ํŒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ๋Š” ํ‚ค์›Œ๋“œ์ด๋ฏ€๋กœ ๊ตฌ๋ฌธ์ด ๊ฐ•์กฐ ํ‘œ์‹œ๋œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IDE์—์„œ ๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” GitHub์—์„œ Rust ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ await ๋Š” foo ์™€ ๋‹ค๋ฅธ ์ƒ‰์ƒ์ด๋‚˜ ๊ตต๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์‹œ์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    let x = foo.match?;
    

    ๊ด€๋ก€์ ์œผ๋กœ ํ•„๋“œ๋Š” ๋ช…์‚ฌ์ธ ๋ฐ˜๋ฉด await ๋Š” ๋™์‚ฌ์ž…๋‹ˆ๋‹ค.

    foo.await ์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ์กฐ๋กฑ ์š”์†Œ๊ฐ€ ์žˆ์ง€๋งŒ ์‹œ๊ฐ์ ์œผ๋กœ ๋งค๋ ฅ์ ์ด๋ฉด์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    ๋ณด๋„ˆ์Šค๋กœ .await ์‚ฌ์šฉํ•˜๋ฉด IDE์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ ํ•˜๋Š” ์  ๊ณผ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (56ํŽ˜์ด์ง€ ์ฐธ์กฐ). ์˜ˆ๋ฅผ ๋“ค์–ด foo. ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ foo ๊ฐ€ ๋ฏธ๋ž˜์ผ ๊ฒฝ์šฐ await ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์„ ํƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ทผ์œก ๊ธฐ์–ต์— ๋Œ€ํ•ด ํ›ˆ๋ จํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์ธ์ฒด ๊ณตํ•™ ๋ฐ ๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ์„ ๋ชจ๋‘ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์—์„œ ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ๋น„ํŒ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. foo# -- # ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด foo ํ•ฉ๋‹ˆ๋‹ค. ? ๋„ ์ธ์žฅ์ด๊ณ  awaiting ๊ฒฝ๋Ÿ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์žฅ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ? ์™€ ๊ฒฐํ•ฉํ•˜๋ฉด foo#? ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ # ์—๋Š” ํŠน๋ณ„ํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์•„์ง ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ์žฅ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

  5. foo@ -- ๋˜ ๋‹ค๋ฅธ ์ธ์žฅ์€ @ ์ž…๋‹ˆ๋‹ค. ? ์™€ ๊ฒฐํ•ฉํ•˜๋ฉด foo@? ๋ฉ๋‹ˆ๋‹ค. ์ด ํŠน์ • ์ธ์žฅ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์ •๋‹น์„ฑ์€ a -ish ( @wait )๋กœ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  6. foo! -- ๋งˆ์ง€๋ง‰์œผ๋กœ ! ์žˆ์Šต๋‹ˆ๋‹ค. ? ์™€ ๊ฒฐํ•ฉํ•˜๋ฉด foo!? ๋ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ WTF ๋Š๋‚Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ! ๋Š” "await"์— ๋งž๋Š” ๊ฐ’์„ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. foo!() ์ด๋ฏธ ํ•ฉ๋ฒ•์ ์ธ ๋งคํฌ๋กœ ํ˜ธ์ถœ์ด๋ฏ€๋กœ ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ (foo)!() ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. foo! ๋ฅผ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ(์˜ˆ: foo! expr )๋ฅผ ๊ฐ€์งˆ ๊ธฐํšŒ๋„ ๋ฐ•ํƒˆ๋ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋‹จ์ผ ์ธ์žฅ์€ foo~ ์ž…๋‹ˆ๋‹ค. ํŒŒ๋„๋Š” "์—์ฝ”" ๋˜๋Š” "์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค"๋กœ ์ดํ•ด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ Rust ์–ธ์–ด์˜ ์–ด๋Š ๊ณณ์—์„œ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๊ฒฐํ‘œ ~ ๋Š” ์˜›๋‚ ์— ํž™ ํ• ๋‹น ์œ ํ˜•์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rfcs/blob/master/text/0059-remove-tilde.md

? ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋„ˆ๋ฌด ๋งŽ์€ ๋งˆ๋ฒ•์ž…๋‹ˆ๊นŒ? impl Try for T: Future ์€(๋Š”) ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋‚˜์š”?

@parasyte ๋„ค ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@jethrogb impl Try ์ง์ ‘ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ? ๋ช…์‹œ์ ์œผ๋กœ return s ํ˜„์žฌ ํ•จ์ˆ˜์—์„œ Try ์˜ ๊ฒฐ๊ณผ์ธ ๋™์•ˆ await ๋Š” yield await ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ? ๋Š” ์ ์šฉ๋˜๋Š” ํ‘œํ˜„์‹์˜ ์œ ํ˜•์— ๋”ฐ๋ผ yield ๋˜๋Š” return yield ์ˆ˜ ์žˆ๋„๋ก ์ƒ์„ฑ๊ธฐ์˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฉ๋ฒ•๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ Future<Output=Result<...>> , ๋‹น์‹ ์ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค let foo = bar()??; ๋ชจ๋‘ ์•Š๋Š”๋‹ค "AWAIT"๋‹ค์Œ ์–ป์„ Ok ์˜ ๋ณ€ํ˜•์„ Result ( ์•„๋‹ˆ๋ฉด yield , return ๋˜๋Š” ๋‹จ์ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” yield ํŠน์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ƒ์„ฑ๊ธฐ์˜ ? ์ž…๋‹ˆ๊นŒ?

๋งˆ์ง€๋ง‰ ๊ด„ํ˜ธ ์•ˆ์˜ ๋ฐœ์–ธ์€ ์‹ค์ œ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ์Šค์ผ€์น˜๋ฅผ ๋ณด๋ ค๋ฉด ํด๋ฆญํ•˜์„ธ์š”.
enum GenOp<T, U, E> { Break(T), Yield(U), Error(E) }

trait TryGen {
    type Ok;
    type Yield;
    type Error;

    fn into_result(self) -> GenOp<Self::Ok, Self::Yield, Self::Error>;
}
์ƒ์„ฑ๊ธฐ ๋‚ด์—์„œ `foo?`๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ์†Œ์œ ๊ถŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  `foo`์˜ ๊ฒฐ๊ณผ๋„ ์Šคํƒ ๊ณ ์ •ํ•ด์•ผ ํ•จ).
loop {
    match TryGen::into_result(foo) {
        GenOp::Break(val) => break val,
        GenOp::Yield(val) => yield val,
        GenOp::Return(val) => return Try::from_error(val.into()),
    }
}

๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ์ฒด๊ณ„์—์„œ ๊นจ์šฐ๊ธฐ ์ปจํ…์ŠคํŠธ ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ? ๊ฐ€ ์ƒ์„ฑ๊ธฐ ๋Œ€์‹  async ์— ๋Œ€ํ•ด ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน๋ณ„ํ•  ๊ฒฝ์šฐ -์—ฌ๊ธฐ์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ๊ธฐ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

? ์žฌ์‚ฌ์šฉ์— ๋Œ€ํ•ด @jethrogb์™€ ๊ฐ™์€ ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Nemo157

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค impl Try ์ง์ ‘ ์ž‘์—…, ? ๋ช…์‹œ ์ ์œผ๋กœ return ์˜ ๊ฒฐ๊ณผ์—์š” Try ํ˜„์žฌ ํ•จ์ˆ˜์—์„œ์ด ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ์š”๊ตฌ yield .

์•„๋งˆ๋„ ? ๋ฐ Try ํŠน์„ฑ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช…์‹œ์  ์œ„์น˜/์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ํด๋กœ์ €์˜ return ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ yield ์™€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ง€ ๋‹ค๋ฅธ ์ƒํƒœ ์ „ํ™˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ? ๋Š” ์ ์šฉ๋˜๋Š” ํ‘œํ˜„์‹์˜ ์œ ํ˜•์— ๋”ฐ๋ผ yield ๋˜๋Š” return yield ์ˆ˜ ์žˆ๋„๋ก ์ƒ์„ฑ๊ธฐ์˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์™œ ๊ทธ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ? ๋ฅผ "๊ณ„์† ๋˜๋Š” ๋ฐœ์‚ฐ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. IMHO. ๋ฌผ๋ก  Try ํŠน์„ฑ์„ ๊ด€๋ จ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ทธ๊ฒƒ์ด Future<Output=Result<...>> ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ• ๊นŒ์š”? let foo = bar()?? ํ•ฉ๋‹ˆ๊นŒ?

๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ์—์„œ ์ผ์ฐ ์ข…๋ฃŒํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋…ผ๋ฆฌ ํ‘œํ˜„์‹์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ. ๋‚˜๋Š” ํŠน๋ณ„ํ•œ tri-state TryGen ๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ์ฒด๊ณ„์—์„œ ๊นจ์šฐ๊ธฐ ์ปจํ…์ŠคํŠธ ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ if ? ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๋Œ€์‹  ๋น„๋™๊ธฐ์— ๋Œ€ํ•ด ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ๋œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์œ ์Šค ์ผ€์ด์Šค์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์ด ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@jethrogb @rolandsteiner ๊ตฌ์กฐ์ฒด๋Š” Try ๋ฐ Future ๋ชจ๋‘๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ด๋–ค ๊ฒƒ์„ ? ํ’€์–ด์•ผ ํ• ๊นŒ์š”?

@jethrogb @rolandsteiner ๊ตฌ์กฐ์ฒด๋Š” Try์™€ Future๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ด๋Š ์ชฝ์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํ’€๋‹ค?

์•„๋‹ˆ์š”. T: Future๋ฅผ ์œ„ํ•œ ํฌ๊ด„์ ์ธ ์•”์‹œ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿด ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช…์‹œ์  ๊ตฌ์„ฑ๊ณผ ์•”์‹œ์  ๋Œ€๊ธฐ ์ œ์•ˆ์— ๋Œ€ํ•ด ์•„๋ฌด๋„ ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์Šค๋ ˆ๋“œ ๋Œ€์‹  ์ž‘์—…์„ ์ฐจ๋‹จํ•œ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๋ฉด sync io์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์ž‘์—…์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์นจ์Šต์ ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ thread-blocking-io์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ "await" ๊ตฌ๋ฌธ์ด ์—†์„๊นŒ์š”?

ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ์ž์ „๊ฑฐ ์…ฐ์ด๋”ฉ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ ์–ด๋„ ์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•œ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ await!(my_future) ์ •์ฐฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ์ž์ „๊ฑฐ ์…ฐ์ด๋”ฉ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ ์–ด๋„ ์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•œ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ await!(my_future) ์ •์ฐฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋งˆ์น˜ ๊ทธ๊ฒƒ์ด ์ง„๋ถ€ํ•˜๊ณ  ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ "๊ทธ๋ƒฅ" ์ž์ „๊ฑฐ๋ฅผ ํƒ€๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. await ๊ฐ€ ์ ‘๋‘์‚ฌ์ธ์ง€ ์ ‘๋ฏธ์‚ฌ์ธ์ง€๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ wrt๋กœ ์ž‘์„ฑ๋˜๋Š” ๋ฐฉ์‹์— ๊ทผ๋ณธ์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹๊ณผ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ์ง€. await!(future) ์— ๋Œ€ํ•œ ์•ˆ์ •ํ™”๋Š” ๋˜ํ•œ await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ํฌ๊ธฐํ•˜์—ฌ ํ–ฅํ›„ await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. "์ ์–ด๋„ ์ง€๊ธˆ์€"์€ ๋‚˜์ค‘์— ๋” ๋‚˜์€ ๊ตฌ๋ฌธ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ  ์ด์— ์ˆ˜๋ฐ˜๋˜๋Š” ๊ธฐ์ˆ ์  ๋ถ€์ฑ„๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚˜์ค‘์— ๊ต์ฒด๋  ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๊ณ ์˜๋กœ ๋ถ€์ฑ„๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

await!(future)์—์„œ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋˜ํ•œ await๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ ํ–ฅํ›„ await๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

try ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ์›์‹œ ident ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•œ ๋‹ค์Œ ์‹œ๋Œ€์— ํ‚ค์›Œ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rolandsteiner

๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ํด๋กœ์ €์˜ return ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ yield ์™€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ง€ ๋‹ค๋ฅธ ์ƒํƒœ ์ „ํ™˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

yield ๋Š” ๋น„๋™๊ธฐ ํด๋กœ์ €์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ async / await ๊ตฌ๋ฌธ์—์„œ generators/ yield ๋‚ฎ์ถ”๋Š” ๋™์•ˆ ๋„์ž…๋œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒ์„ฑ๊ธฐ ๊ตฌ๋ฌธ์—์„œ yield ๋Š” return ์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ? ํ™•์žฅ์ด ์ƒ์„ฑ๊ธฐ ๋ณ€ํ™˜ ์ „์— ์™„๋ฃŒ๋˜๋ฉด ์‚ฝ์ž… ์‹œ์ ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. return ๋˜๋Š” yield .

๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ์—์„œ nalso๊ฐ€ ์ผ์ฐ ์ข…๋ฃŒ๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋…ผ๋ฆฌ์  ํ‘œํ˜„์‹์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ.

๋…ผ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋งŽ์€(๋Œ€๋ถ€๋ถ„?) ๊ฒฝ์šฐ๊ฐ€ IO ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์ค‘ ?? ๋กœ ์ฑ„์›Œ์ง„๋‹ค๋Š” ๊ฒƒ์ด ๋‚˜์—๊ฒŒ๋Š” ๋‹จ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๊นจ์šฐ๊ธฐ ์ปจํ…์ŠคํŠธ ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค ...

์ด ๋ถ€๋ถ„์ด ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋น„๋™๊ธฐ ๋ณ€ํ™˜์€ ์ƒ์„ฑ๋œ Future::poll ํ•จ์ˆ˜์—์„œ ๊นจ์šฐ๊ธฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ๋ณ€์ˆ˜๋ฅผ ๋ณ€ํ™˜๋œ ๋Œ€๊ธฐ ์ž‘์—…์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๊ฒƒ์€ std ์ œ๊ณตํ•˜๋Š” TLS ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ๋‘ ๋ณ€ํ™˜ ๋ชจ๋‘ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ? ๊ฐ€ ๋Œ€์‹  _์ƒ์„ฑ๊ธฐ ์ˆ˜์ค€์—์„œ_ ์žฌํ•ญ๋ณต ์ง€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉด ๋น„๋™๊ธฐ ๋ณ€ํ™˜์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜ ์ฐธ์กฐ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‘ ๋‹ฌ ์ „์— ๋‚ด ์„ ํ˜ธ๋„๋ฅผ ์„ค๋ช…ํ•˜๋Š” await ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑ

  • ๋‚ด ์ผ๋ฐ˜์ ์ธ ์˜๊ฒฌ์€ Rust๊ฐ€ ์ด๋ฏธ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์˜ˆ์‚ฐ์„ ์‹ค์ œ๋กœ ๋Š˜๋ ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‘œ๋ฉด ์ˆ˜์ค€ async/await ๊ตฌ๋ฌธ์€ JavaScript, Python ๋˜๋Š” C#์—์„œ ์˜ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ€๋Šฅํ•œ ํ•œ ์นœ์ˆ™ํ•œ ๊ฒƒ์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€์ ์—์„œ ๊ทœ๋ฒ”์—์„œ ์•ฝ๊ฐ„๋งŒ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์€ ๋ถ„๊ธฐ์˜ ์ •๋„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(์˜ˆ: foo await ๋Š” foo@ ์™€ ๊ฐ™์€ ์ผ๋ถ€ ๊ธฐํ˜ธ๋ณด๋‹ค ๋ถ„๊ธฐ๊ฐ€ ์ ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋‘ ์ ‘๋‘์–ด๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ! ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. async/await๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ์™œ await๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ ๋งคํฌ๋กœ์ธ์ง€ ๊ถ๊ธˆํ•ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ "๊ธ€์Ž„ ์šฐ๋ฆฌ๋Š” ์ข‹์€ ๊ตฌ๋ฌธ์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์–ด์„œ ๊ทธ๋ƒฅ ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค." ์ด๊ฒƒ์€ ์„ค๋“๋ ฅ ์žˆ๋Š” ๋Œ€๋‹ต์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์ด์˜ ์—ฐ๊ด€ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค ! ๋ฐ ์ œ์–ด ํ๋ฆ„์ด ์ •๋ง๋กœ ์ถฉ๋ถ„์ด ๊ตฌ๋ฌธ์„ ์ •๋‹นํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค : ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ! ์ด์—†๋Š”์ด ๊ฝค ํŠนํžˆ ํ‰๊ท  ๋งคํฌ๋กœ expension.
  • ๋‚˜๋Š” ์ผ์ข…์˜ ์ ‘๋ฏธ์‚ฌ์˜ ์ด์ต์˜ ์˜์‹ฌ์˜์ด์•ผ (์ „์ ์œผ๋กœ ๋‹จ์ง€ ์ข…๋ฅ˜์˜) ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ท ํ˜•์ด ? ์™€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด awaiting์€ ๋” ๋น„์‹ผ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋‹จ์ง€ ๋ถ„๊ธฐํ•˜๊ณ  ํ•œ ๋ฒˆ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฃจํ”„์—์„œ ์–‘๋ณดํ•ฉ๋‹ˆ๋‹ค). ๋‹จ์ผ ํ‘œํ˜„์‹์—์„œ ๋‘์„ธ ๋ฒˆ ๋Œ€๊ธฐํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ๊ทธ๋“ค ์ž์‹ ์˜ let ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋‹น๊ฒจ์ ธ์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์—๊ฒŒ๋Š” ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ try! ๋Œ€ ? ์ ˆ์ถฉ์€ ์—ฌ๊ธฐ์—์„œ ๋‚˜์—๊ฒŒ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋‹น๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ let์œผ๋กœ ๊บผ๋‚ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ๋ฉ”์„œ๋“œ ์ฒด์ธ์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ฝ”๋“œ ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, foo await ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๋น„๊ต์  ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ฐฐ์›Œ์•ผ ํ•  ๊ฒƒ์€ await๊ฐ€ ๋งค์šฐ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋ผ Rust์—์„œ ํ‘œํ˜„์‹ ๋’ค์— ์˜จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค๋ฃจ์–ด์ง„ ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹๊ณผ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋‚ด๊ฐ€ ์ด์ „์— ์–ธ๊ธ‰ํ•œ ์ด์œ ๋กœ ๋‹จ์ ์ด ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ์žฅ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ์ง€ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ๋ฒ• ๊ทœ์น™์ด ์žˆ๋‹ค๋ฉด ์ข€ ๋” ๊ฐ•์š” ๋  ์ˆ˜ foo await.method() ์ •๋ง ๋ฐฉ๋ฒ•์ด๋˜๊ณ ์žˆ๋Š” ๋Š๋‚Œ์„ํ•ด์„œ (๋ฌด์˜๋ฏธ)์— ์ ์šฉ await ํ•˜์ง€ foo (๋ฐ˜๋ฉด ํฅ๋ฏธ๋กญ๊ฒŒ foo await? ์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋Š๊ปด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์— ๊ธฐ๋Œ€๊ณ  ์žˆ์ง€๋งŒ await ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let x = (x.do_something() await).do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;

๊ผญ ์ด์ƒ์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ํ•œ ์ค„์— ๋งŽ์€ ๊ฒƒ์„ ๋‹ด์œผ๋ ค๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•ž์„œ ์–ธ๊ธ‰ํ•œ

let x = x.do_something() await
         .do_another_thing() await;

let x = x.foo(|| ...)
         .bar(|| ... )
         .baz() await;
  • ํ‘œ๋ฉด ์ˆ˜์ค€ async/await ๊ตฌ๋ฌธ์€ JavaScript, Python ๋˜๋Š” C#์—์„œ ์˜ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ€๋Šฅํ•œ ํ•œ ์นœ์ˆ™ํ•œ ๊ฒƒ์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

try { .. } ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ์นœ์ˆ™๋„๋ฅผ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋˜ํ•œ Rust์™€ ๋‚ด๋ถ€ ์ผ๊ด€์„ฑ์˜ POV์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๋””์ž์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ชจ๋“  ์ ์ ˆํ•œ ์กด์ค‘๊ณผ ํ•จ๊ป˜ Rust์˜ ๋‚ด๋ถ€ ์ผ๊ด€์„ฑ์ด ๋” ์ค‘์š”ํ•ด ๋ณด์ด๋ฉฐ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์ด ์šฐ์„  ์ˆœ์œ„ ๋˜๋Š” API ๊ตฌ์กฐ ์ธก๋ฉด์—์„œ Rust์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋˜ํ•œ ! ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. async/await๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ์™œ await๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ ๋งคํฌ๋กœ์ธ์ง€ ๊ถ๊ธˆํ•ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ "๊ธ€์Ž„ ์šฐ๋ฆฌ๋Š” ์ข‹์€ ๊ตฌ๋ฌธ์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์–ด์„œ ๊ทธ๋ƒฅ ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค." ์ด๊ฒƒ์€ ์„ค๋“๋ ฅ ์žˆ๋Š” ๋Œ€๋‹ต์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๊ฐ์ •์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. .await!() ๋Š” ์ผ๋ฅ˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ postfix await์˜ ์ด์ ์— ๋Œ€ํ•ด ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ท ํ˜•์ด ? ์™€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. awaiting์€ ๋” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

let ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋ฌผ๊ฑด์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์šฉ์ด ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์ฒด์ธ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋•Œ๋กœ๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. let ๋ฐ”์ธ๋”ฉ์˜ ์ด์ ์€ a) ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์ถฉ๋ถ„ํžˆ ํฐ ์กฐ๊ฐ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๊ณ , b) ๋™์ผํ•œ ๊ณ„์‚ฐ ๊ฐ’์„ ๋‘ ๋ฒˆ ์ด์ƒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: &x ๋˜๋Š” ์œ ํ˜•์ด ๋ณต์‚ฌ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ).

๋‹จ์ผ ํ‘œํ˜„์‹์—์„œ ๋‘์„ธ ๋ฒˆ ๋Œ€๊ธฐํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ๊ทธ๋“ค ์ž์‹ ์˜ let ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋‹น๊ฒจ์ ธ์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์—๊ฒŒ๋Š” ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž์‹ ์˜ let ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด await ์ ‘๋ฏธ์‚ฌ๋กœ ์—ฌ์ „ํžˆ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let temporary = some_computation() await?;

๋™์˜ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ ์—ฐ๊ฒฐ์„ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ ‘๋ฏธ์‚ฌ await ์‚ฌ์šฉํ•˜๋ฉด ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ postfix๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ์ฝ๊ธฐ ๋ฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ˆœ์„œ๋ฅผ ๋” ์ž˜ ๋”ฐ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ let ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ถ”์ถœํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ postfix๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ await ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์œ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‘์„ธ ๋ฒˆ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด( rustfmt ์˜ ๊ฒฐ๊ณผ์ž„):

    let foo = alpha()
        .beta
        .some_other_stuff()
        .await?
        .even_more_stuff()
        .stuff_and_stuff();

๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ let์œผ๋กœ ๊บผ๋‚ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ๋ฉ”์„œ๋“œ ์ฒด์ธ์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ฝ”๋“œ ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฝ์€ ์žํ™์ƒ‰ ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์€ let ๋ฐ”์ธ๋”ฉ๊ณผ let binding = await!(...)?; ๋กœ ์ถ”์ถœํ•  ๋•Œ ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๋น„๊ต์  ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ฐฐ์›Œ์•ผ ํ•  ๊ฒƒ์€ await๊ฐ€ ๋งค์šฐ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋ผ Rust์—์„œ ํ‘œํ˜„์‹ ๋’ค์— ์˜จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ foo.await ๋Œ€ํ•œ ์„ ํ˜ธ๋„๋Š” ์ฃผ๋กœ ๋ฉ‹์ง„ ์ž๋™ ์™„์„ฑ๊ณผ ์ ์˜ ํž˜์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„ ๋Š๋‚Œ๋„ ์—†์Šต๋‹ˆ๋‹ค. foo.await.method() ๋ฅผ ์“ฐ๋ฉด .method() ๊ฐ€ foo.await ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ๋„ ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๊ณ ๋ฏผ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค๋ฃจ์–ด์ง„ ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์šฐ์„  ์ˆœ์œ„์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์ฒด์ธ๋„ ๋˜‘๊ฐ™์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹๊ณผ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋‚ด๊ฐ€ ์ด์ „์— ์–ธ๊ธ‰ํ•œ ์ด์œ ๋กœ ๋‹จ์ ์ด ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ์žฅ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ์ง€ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ๋ฒ• ๊ทœ์น™์ด ์žˆ๋‹ค๋ฉด ์ข€ ๋” ๊ฐ•์š” ๋  ์ˆ˜ foo await.method() ์ •๋ง ๋ฐฉ๋ฒ•์ด๋˜๊ณ ์žˆ๋Š” ๋Š๋‚Œ์„ํ•ด์„œ (๋ฌด์˜๋ฏธ)์— ์ ์šฉ await ํ•˜์ง€ foo (๋ฐ˜๋ฉด ํฅ๋ฏธ๋กญ๊ฒŒ foo await? ์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋Š๊ปด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์˜๋„์ ์ธ ๋””์ž์ธ ํŽ˜์ดํผ์ปท์„ ๋„์ž…ํ•˜๊ณ  ์ ‘๋ฏธ์‚ฌ await ๊ตฌ๋ฌธ์œผ๋กœ ๋ฉ”์„œ๋“œ ์—ฐ๊ฒฐ์„ ๋ฐฉ์ง€ํ–ˆ๋‹ค๋ฉด foo await ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ์˜ต์…˜์—๋Š” ๋‹จ์ ์ด ์žˆ๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ ํƒ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์ •ํ•˜๋ฉด... foo.await ์— ๋Œ€ํ•ด ๋‚˜๋ฅผ ๊ดด๋กญํžˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ๊ทธ๊ฒƒ์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์˜คํ•ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋”๋ผ๋„ ๊ตฌ์กฐ์ฒด ํ•„๋“œ, ์—ฌ์ „ํžˆ ๊ตฌ์กฐ์ฒด ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค . ํ•„๋“œ ์•ก์„ธ์Šค์˜ ์˜๋ฏธ๋Š” ํŠน๋ณ„ํžˆ ์˜ํ–ฅ๋ ฅ ์žˆ๋Š” ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Rust์—์„œ ๊ฐ€์žฅ ํšจ๊ณผ๊ฐ€ ์ ์€ ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•œํŽธ, ๋Œ€๊ธฐ๋Š” ๊ฐ€์žฅ ์‚ฌ์ด๋“œ ํ–‰ํ•˜๋Š” ์—ฐ์‚ฐ ํ•œ ๋งค์šฐ ํšจ๊ณผ์ ์ธ ๊ฒƒ์ด๋‹ค (์ด๋ฅผ I / O ๋™์ž‘์ด ๋ฏธ๋ž˜์— ๊ตฌ์ถ• ๋ฐ ์ œ์–ด ํ๋ฆ„ ํšจ๊ณผ๊ฐ€ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•œ๋‹ค). ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ foo.await.method() ์ฝ์„ ๋•Œ ๋‚ด ๋‘๋‡Œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ํฅ๋ฏธ๋กญ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— .await ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ๋ณธ๋Šฅ์„ ์ˆ˜๋™์œผ๋กœ ๋ฌด์‹œํ•˜๋ ค๋ฉด ์ฃผ์˜์™€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๊ตฌ์กฐ์ฒด ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” _๋ชจ์–‘_์ž…๋‹ˆ๋‹ค.

@glaebhoerl ์ข‹์€ ์ง€์ ์„ .await ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•„๋“œ ์•ก์„ธ์Šค์˜ ์˜๋ฏธ๋Š” ํŠน๋ณ„ํžˆ ์˜ํ–ฅ๋ ฅ ์žˆ๋Š” ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Rust์—์„œ ๊ฐ€์žฅ ํšจ๊ณผ๊ฐ€ ์ ์€ ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•œํŽธ ๊ธฐ๋‹ค๋ฆผ์€ ๊ฐ€์žฅ ๋ถ€์ž‘์šฉ์ด ๋งŽ์€ ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ธ ๋งค์šฐ ์˜ํ–ฅ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋ฏธ๋ž˜์— ๊ตฌ์ถ•๋œ I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ๋ฆ„ ์ œ์–ด ํšจ๊ณผ๊ฐ€ ์žˆ์Œ).

๋‚˜๋Š” ์ด๊ฒƒ์— ๊ฐ•๋ ฅํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. await ๋Š” break ๋˜๋Š” return ์™€ ๊ฐ™์€ ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์ด๋ฉฐ ๋ช…์‹œ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์€ Python์˜ if ์ฒ˜๋Ÿผ ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. compare if c { e1 } else { e2 } to e1 if c else e2 . ๋งˆ์ง€๋ง‰์— ์—ฐ์‚ฐ์ž๋ฅผ ๋ณด๋ฉด ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ์— ๊ด€๊ณ„์—†์ด ์ด์ค‘ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ e.await ๊ฐ€ await!(e) ๋˜๋Š” await e ๋ณด๋‹ค Rust ๊ตฌ๋ฌธ๊ณผ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ๋Š” ์—†์œผ๋ฉฐ, ์•„์ด๋””์–ด ์ค‘ ํ•˜๋‚˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ์—์„œ ํŠน์ˆ˜ ์ผ€์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ผ๊ด€์„ฑ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ธ๊ธ‰๋œ @withoutboats ์นœ์ˆ™์„ฑ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋†€๋ผ์šด ์ด์ ์ด ์žˆ๋‹ค๋ฉด ์ด์ƒํ•˜๊ณ  ๋ฉ‹์ง„ ๊ตฌ๋ฌธ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๋ฏธ์‚ฌ await ์— ๊ทธ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋Š” ๋ชจ์–‘๊ณผ ๋‡Œ๊ฐ€ ์‚ฌ๋ฌผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

(์ข‹์€ ์งˆ๋ฌธ์€, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์ œ์—์žˆ๋Š” ๋™์•ˆ ์–ผ๋งˆ๋‚˜ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ์‹œ๋„ (๊ณผ) ๋งŒ ๊ฐ€์ ธ ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š๊ณ . ์ถ”์ธก ... ์˜ค๋žœ ์‹œ๊ฐ„์ด ์–ด๋ ต๋‹ค ์ œ๊ฐ€ ๋ง์”€ ๋“œ๋ฆฐ ์ „, ๊ตฌ๋ฌธ ๊ฐ•์กฐ๋Š” ์ œ์–ด ํ๋ฆ„ ํšจ๊ณผ๋ฅผ ๋ชจ๋“  ์‚ฌ์—…์ž (๊ฐ•์กฐํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” return , break , continue , ? ... ์ง€๊ธˆ๊ณผ await ) ํŠน๋ณ„ํ•œ ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ์ €๋Š” ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ๋‹ด๋‹นํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์ด๊ฒƒ์— ๊ฐ•๋ ฅํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. await ๋Š” break ๋˜๋Š” return ์™€ ๊ฐ™์€ ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์ด๋ฉฐ ๋ช…์‹œ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋™์˜ํ•œ๋‹ค. foo.await , foo await , foo# , ... ํ‘œ๊ธฐ๋ฒ• ์€ ๋ช…์‹œ์  ์ž…๋‹ˆ๋‹ค. ์•”๋ฌต์ ์ธ ๋Œ€๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ e.await ๊ฐ€ await!(e) ๋˜๋Š” await e ๋ณด๋‹ค Rust ๊ตฌ๋ฌธ๊ณผ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

e.await ์ž์ฒด ๊ตฌ๋ฌธ์€ Rust ๊ตฌ๋ฌธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๋ฏธ์‚ฌ๋Š” ? ๋ฐ Rust API๊ฐ€ ๊ตฌ์กฐํ™”๋˜๋Š” ๋ฐฉ์‹์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค(๋ฐฉ๋ฒ•์ด ์ž์œ  ํ•จ์ˆ˜๋ณด๋‹ค ์„ ํ˜ธ๋จ).

await e? ๊ตฌ๋ฌธ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ (await e)? ๋ฐฉ๋ฒ•๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ break ๋ฐ return ์—ฐ๊ด€. await!(e) ์—ญ์‹œ ์ œ์–ด ํ๋ฆ„์„ ์œ„ํ•œ ๋งคํฌ๋กœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์„ฑ์ด ์—†๊ณ  ๋‹ค๋ฅธ ์ ‘๋‘์‚ฌ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ๋Š” ์—†์œผ๋ฉฐ, ์•„์ด๋””์–ด ์ค‘ ํ•˜๋‚˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ์—์„œ ํŠน์ˆ˜ ์ผ€์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ผ๊ด€์„ฑ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

.await ๋Œ€ํ•ด libsyntax๋ฅผ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ํ•„๋“œ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ๋Š” ํŠน์ˆ˜ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” resolve ๋˜๋Š” HIR์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋†€๋ผ์šด ์ด์ ์ด ์žˆ๋‹ค๋ฉด ์ด์ƒํ•˜๊ณ  ๋ฉ‹์ง„ ๊ตฌ๋ฌธ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๋ฏธ์‚ฌ await ์— ๊ทธ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฉ”์†Œ๋“œ ์ฒด์ธ๊ณผ Rust์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์„ ํ˜ธ๋„ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ํ•„๋“œ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— .await์— ๋Œ€ํ•ด libsyntax๋ฅผ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์žฌ๋ฏธ.
๋”ฐ๋ผ์„œ ์•„์ด๋””์–ด๋Š” self / super ...์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์žฌ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์•„๋‹Œ ํ•„๋“œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด await ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ ํ‚ค์›Œ๋“œ๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ(๋ถ„์„์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์—) ์ด์— ๋Œ€ํ•œ ์›์‹œ ์‹๋ณ„์ž ๋ฅผ

#[derive(Default)]
struct S {
    r#await: u8
}

fn main() {
    let s = ;
    let z = S::default().await; //  Hmmm...
}

์•”๋ฌต์ ์ธ ๋Œ€๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๋Š” ์ด ์Šค๋ ˆ๋“œ("์•”์‹œ์  ๋Œ€๊ธฐ" ์ œ์•ˆ)์—์„œ ๋‘ ๋ฒˆ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

์ œ์–ด ํ๋ฆ„์„ ์œ„ํ•œ ๋งคํฌ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

try! (์ด๋Š” ๋ชฉ์ ์„ ์ž˜ ์ˆ˜ํ–‰ํ•จ) ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ‹€๋ฆผ์—†์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” select! ์ž…๋‹ˆ๋‹ค. await ๋Š” return ๋ณด๋‹ค "๋” ๊ฐ•๋ ฅ"ํ•˜๋ฏ€๋กœ ? ์˜ return ๋ณด๋‹ค ์ฝ”๋“œ์—์„œ ๋” ์ž˜ ๋ณด์ผ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฉ”์†Œ๋“œ ์ฒด์ธ๊ณผ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ Rust์˜ ์„ ํ˜ธ๋„ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ ‘๋‘์‚ฌ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ (๋” ๋ˆˆ์— ๋„๋Š”) ๊ธฐ๋ณธ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ ค ์ „์ž? (await e)๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ? break ๋ฐ return ์—ฐ๊ด€ ๋ฐฉ๋ฒ•๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” await!(e)? , await { e }? ๋˜๋Š” ์‹ฌ์ง€์–ด { await e }? ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค -- ์ €๋Š” ํ›„์ž๊ฐ€ ๋…ผ์˜๋˜๋Š” ๊ฒƒ์„ ๋ณธ ์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


์ขŒ์šฐ ํŽธํ–ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. _๋ฉ”๋ชจ_

์ด์— ๋Œ€ํ•œ ๋‚ด ์ƒ๊ฐ์€ ๋ฌธ์ œ๋ฅผ ๋ณผ ๋•Œ๋งˆ๋‹ค ๋งˆ์น˜ ์•…๋งˆ์˜ ์˜นํ˜ธ์ž ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ”๋€Œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๋‚ด๊ฐ€ ๋‚ด ๋ฏธ๋ž˜์™€ ์ƒํƒœ ๋จธ์‹ ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. poll ์˜ ๋งž์ถคํ˜• ๋ฏธ๋ž˜๋Š” ์™„์ „ํžˆ ์ •์ƒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ Rust์˜ ์ œ๋กœ ๋น„์šฉ ์ถ”์ƒํ™”๋Š” ๋Ÿฐํƒ€์ž„์— ์ œ๋กœ ๋น„์šฉ๊ณผ ๋” ์ค‘์š”ํ•˜๊ฒŒ๋Š” ์ •์‹ ์ ์œผ๋กœ ์ œ๋กœ ๋น„์šฉ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฏธ๋ž˜๋ฅผ ํฌํ•จํ•˜์—ฌ Rust์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ถ”์ƒํ™”์— ๋Œ€ํ•ด ๋งค์šฐ ์‰ฝ๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ๋‹จ์ง€ ์ƒํƒœ ๊ธฐ๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ์†Œํ•œ์˜ ๋งˆ๋ฒ•์„ ๋„์ž…ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ธ์žฅ์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งˆ๋ฒ• ๊ฐ™์€ ๋Š๋‚Œ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” .await ๋งค์ง ํ•„๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์€ ๊ฐ€์žฅ ์‰ฌ์šด ์†”๋ฃจ์…˜์ธ ์›๋ž˜ await! ๋งคํฌ๋กœ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ชจ๋“  ์ ์ ˆํ•œ ์กด์ค‘๊ณผ ํ•จ๊ป˜ Rust์˜ ๋‚ด๋ถ€ ์ผ๊ด€์„ฑ์ด ๋” ์ค‘์š”ํ•ด ๋ณด์ด๋ฉฐ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์ด ์šฐ์„  ์ˆœ์œ„ ๋˜๋Š” API ๊ตฌ์กฐ ์ธก๋ฉด์—์„œ Rust์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด...? await(foo)? / await { foo }? ๋Š” ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„์™€ API๊ฐ€ Rust์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๋Š”์ง€ ๋ฉด์—์„œ ์™„์ „ํžˆ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹จ์ ์€ ๊ด„ํ˜ธ์™€ (๋‹น์‹ ์˜ ๊ด€์ ์— ๋”ฐ๋ผ) ์—ฐ๊ฒฐ์˜ ์žฅํ™ฉํ•จ์ž…๋‹ˆ๋‹ค. ํ˜ผ๋ž€์Šค๋Ÿฌ์šด.

try! (์ด๋Š” ๋ชฉ์ ์„ ์ž˜ ์ˆ˜ํ–‰ํ•จ) ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ‹€๋ฆผ์—†์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” select! ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋‹จ์–ด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. try!(...) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Rust 2018์—์„œ ํ•˜๋“œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์ผ๊ธ‰ ๋ฐ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ๋Š” ์–ด๋ ค์šด ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

await ๋Š” return ๋ณด๋‹ค "๋” ๊ฐ•๋ ฅ"ํ•˜๋ฏ€๋กœ ? ์˜ return ๋ณด๋‹ค ์ฝ”๋“œ์—์„œ ๋” ์ž˜ ๋ณด์ผ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

? ์—ฐ์‚ฐ์ž๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถ€์ž‘์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ( Result ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ํ†ตํ•ด) ์ œ์–ด ํ๋ฆ„์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋งค์šฐ "๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค". ๋…ผ์˜ ๋‹น์‹œ ? ๋Š” '๋ฐ˜ํ’ˆ์„ ์ˆจ๊ธฐ๊ณ  ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฝ๋‹ค await ์ €์™€ ์ƒ๋‹นํžˆ ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ ‘๋‘์‚ฌ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ (๋” ๋ˆˆ์— ๋„๋Š”) ๊ธฐ๋ณธ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ ‘๋‘์‚ฌ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž๋Š” ! ์œ ํ˜•์œผ๋กœ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. ํ•œํŽธ impl Try<Ok = T, ...> ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ T ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž ? T ๋Š” ์ ‘๋ฏธ์‚ฌ์ž…๋‹ˆ๋‹ค.

์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด...? await(foo)? / await { foo }? ๋Š” ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„์™€ API๊ฐ€ Rust-

await(foo) ๊ตฌ๋ฌธ์€ ๊ด„ํ˜ธ๊ฐ€ ์ „์ž์— ํ•„์š”ํ•˜๊ณ  ํ›„์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ await foo ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ž๋Š” ์ „๋ก€๊ฐ€ ์—†๊ณ  ํ›„์ž๋Š” ์šฐ์„ ์ˆœ์œ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ? ์—ฌ๊ธฐ, ๋ณดํŠธ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๋ฐ Discord์—์„œ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. await { foo } ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/issues/50547#issuecomment-454313611 ์ฐธ์กฐ).

๊ทธ๊ฒƒ์˜ ๋‹จ์ ์€ ๊ด„ํ˜ธ์™€ (๊ด€์ ์— ๋”ฐ๋ผ) ์—ฐ๊ฒฐ์˜ ์žฅํ™ฉํ•จ์ด๋ฉฐ, ์„ ๋ก€๋ฅผ ์–ด๊ธฐ๊ฑฐ๋‚˜ ํ˜ผ๋ž€์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ "API๊ฐ€ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๋‹ค"๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋ฉ”์†Œ๋“œ์™€ ๋ฉ”์†Œ๋“œ ์ฒด์ธ์ด Rust์—์„œ ์ผ๋ฐ˜์ ์ด๊ณ  ๊ด€์šฉ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์–ด ๋ฐ ๋ธ”๋ก ๊ตฌ๋ฌธ์€ ํ•ด๋‹น ๊ตฌ๋ฌธ๊ณผ ? ๊ตฌ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์˜๊ฒฌ์ด ์†Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ €๋ฅผ ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค.

์ ‘๋‘์‚ฌ ๋Œ€ ์ ‘๋ฏธ์‚ฌ ํ† ๋ก ์„ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ๋กœ ์˜ฎ๊ธฐ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฌ๊ธฐ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์ด ๊ณต์ •ํ• ๊นŒ์š”? ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋Šฅ ์˜ ์ƒํƒœ ๋ฅผ

@seanmonstar ์˜ˆ, ์ถ”์  ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์ œํ•œํ•˜๊ณ  ์‹ค์ œ๋กœ ์ƒํƒœ ์—…๋ฐ์ดํŠธ์— ๋ถˆ๊ณผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ–๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋žŒ์— ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋™๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RFC ํ”„๋กœ์„ธ์Šค ๋ฐ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์ˆ˜์ •์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ† ๋ก ์— ์‚ฌ์šฉํ•  ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ๊ธฐ ์—์„œ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘์—๊ฒŒ ์ค‘์š”: ์ถ”๊ฐ€ await ๊ตฌ๋ฌธ ๋…ผ์˜๋Š” ์—ฌ๊ธฐ์— ์žˆ์–ด์•ผ

await ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ํ–ฅํ›„ ๋…ผ์˜๊ฐ€ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฃจ ๋™์•ˆ ์ผ์‹œ์ ์œผ๋กœ ์ž ๊ธ‰๋‹ˆ๋‹ค.

2019๋…„ 1์›” 15์ผ ํ™”์š”์ผ 07:10:32AM -0800์—์„œ Pauan์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let x = (x.do_something() await).do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;

๊ทธ๊ฒƒ์€ postfix await์˜ ์ฃผ์š” ์ด์ ์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค: "๊ทธ๋ƒฅ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.
์“ฐ๊ธฐ/์ฝ๊ธฐ". ์ ‘๋ฏธ์‚ฌ๋Š” ? ์ ‘๋ฏธ์‚ฌ์ฒ˜๋Ÿผ ์ œ์–ด ํ๋ฆ„์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ณ„์† ์ด๋™ํ•˜๋ ค๋ฉด:

foo().await!()?.bar().await!()

await! ๊ฐ€ ์ ‘๋‘์–ด์ธ ๊ฒฝ์šฐ ๋˜๋Š” try! ๊ฐ€ ์ ‘๋‘์–ด์ผ ๋•Œ ๋’ค๋กœ ๋˜๋Š” ๋‹ค์Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
๊ด„ํ˜ธ๋กœ ๋ฌถ์œผ๋ ค๋ฉด ์™ผ์ชฝ์œผ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์“ฐ๊ฑฐ๋‚˜ ์ฝ์„ ๋•Œ์˜ ํ‘œํ˜„.

ํŽธ์ง‘: ๋‚˜๋Š” ์ด๋ฉ”์ผ์„ ํ†ตํ•ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋Œ“๊ธ€์„ ์ฝ๊ณ  ์žˆ์—ˆ๊ณ  ์ด ๋ฉ”์ผ์„ ๋ณด๋‚ด๊ธฐ ์ „๊นŒ์ง€ "๋Œ€ํ™”๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ œ๋กœ ์ด๋™" ๋Œ“๊ธ€์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งํฌ ์—…๋ฐ์ดํŠธ: https://github.com/rust-lang/rust/issues/53259 ๋ฐ https://github.com/rust-lang/rust/issues/53447 ์ด ํ์‡„๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang-nursery/futures-rs/issues/1199 ๊ฐ€ .

๋น„๋™๊ธฐ ๋Œ€๊ธฐ ์ƒํƒœ ๋ณด๊ณ ์„œ:

http://smallcultfollowing.com/babysteps/blog/2019/03/01/async-await-status-report/


async-await ์ƒํƒœ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
๋…ธ๋ ฅ. ์งง์€ ๋ฒ„์ „์€ ์šฐ๋ฆฌ๊ฐ€ ํ™ˆ ์ŠคํŠธ๋ ˆ์น˜ ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์–ด๋–ค ์ข…๋ฅ˜์˜ ์•ˆ์ •ํ™”, ๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ
๊ทน๋ณตํ•ด์•ผ ํ•  ์งˆ๋ฌธ.

๊ตฌํ˜„ ์ž‘์—… ๊ทธ๋ฃน ๋ฐœํ‘œ

์ด๋Ÿฌํ•œ ๋…ธ๋ ฅ์˜ ์ผํ™˜์œผ๋กœ
async-await ๊ตฌํ˜„ ์ž‘์—… ๊ทธ๋ฃน . ์ด ์ž‘์—… ๊ทธ๋ฃน
์ „์ฒด async-wait ๋…ธ๋ ฅ์˜ ์ผ๋ถ€์ด์ง€๋งŒ
๊ตฌํ˜„์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ ํŒ€์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ
๊ฒฐ์Šน์„ ์— ๋Œ€ํ•œ ๋น„๋™๊ธฐ ๋Œ€๊ธฐ๋ฅผ ๋„์™€์ฃผ์„ธ์š”. ๋ฌธ์ œ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ํ™•์‹คํžˆ ๋„์›€์ด ํ•„์š”ํ•œ ๊ณณ(๊ณ„์† ์ฝ์–ด๋ณด๊ธฐ).

์ฐธ์—ฌ์— ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด "์‚ฌ๋ฌด์‹ค ์‹œ๊ฐ„"์ด ์žˆ์Šต๋‹ˆ๋‹ค.ํ™”์š”์ผ๋กœ ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค([์ปดํŒŒ์ผ๋Ÿฌ ํŒ€ ์บ˜๋ฆฐ๋”] ์ฐธ์กฐ) -- ๋งŒ์•ฝ ๋‹น์‹ ์ด
๊ทธ๋Ÿฌ๋ฉด [Zulip]์— ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค! (๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์•„๋ฌด๊ฑฐ๋‚˜ ํŒ๋‹ˆ๋‹ค.
์‹œ๊ฐ.)

...

std::future::Future ์–ธ์ œ ์•ˆ์ •ํ™”๋˜๋‚˜์š”? ๋น„๋™๊ธฐ ๋Œ€๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•„์ฃผ ๋ฉ‹์ง„ ๋””์ž์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๊ฒƒ์— ์ฝ”๋“œ ํฌํŒ…์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. (์Šคํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹ฌ์ด ์žˆ๋‚˜์š”?)

@ry ์ƒˆ๋กœ์šด ์ถ”์  ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค: https://github.com/rust-lang/rust/issues/59113

async/await์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฌธ์ œ: https://github.com/rust-lang/rust/issues/59245

๋˜ํ•œ ์ƒ๋‹จ ๊ฒŒ์‹œ๋ฌผ์˜ https://github.com/rust-lang-nursery/futures-rs/issues/1199 ๋Š” ์ด์ œ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ์ฒดํฌ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HRLB ๋ฐ ๋น„๋™๊ธฐ ํ์‡„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค: https://github.com/rust-lang/rust/issues/59337. (๊ทธ๋Ÿฌ๋‚˜ RFC๋ฅผ ๋‹ค์‹œ ํ›‘์–ด๋ณด๋ฉด ์‹ค์ œ๋กœ ๋น„๋™๊ธฐ ํด๋กœ์ €๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ์ธ์ˆ˜ ์ˆ˜๋ช… ์บก์ฒ˜ ๋Œ€์ƒ์ž„์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๋„ค, ๋น„๋™๊ธฐ ํด๋กœ์ €์—๋Š” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ดˆ๊ธฐ ์•ˆ์ •ํ™” ๋‹จ๊ณ„์— ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋™์ž‘์€ ํด๋กœ์ € + ๋น„๋™๊ธฐ ๋ธ”๋ก์œผ๋กœ ์—๋ฎฌ๋ ˆ์ดํŠธ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฏธ๋ž˜์—๋Š” ๋ฐ˜ํ™˜๋œ ๋ฏธ๋ž˜์—์„œ ํด๋กœ์ €์˜ upvar๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„์ „์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ await!(fut) ๊ฐ€ fut ๊ฐ€ Unpin ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist= 9c189fae3cfeecbb041f68f02f31893d

์˜ˆ์ƒ์ธ๊ฐ€์š”? RFC์— ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Ekleog ๋Š” await! ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ await! ๋Š” ์ „๋‹ฌ๋œ ๋ฏธ๋ž˜๋ฅผ ๊ฐœ๋…์ ์œผ๋กœ ์Šคํƒ ๊ณ ์ •ํ•˜์—ฌ !Unpin ์„ ๋ฌผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค( ๋น ๋ฅธ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์˜ˆ ). ์˜ค๋ฅ˜๋Š” impl Future for Box<impl Future + Unpin> ์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ฝ ์กฐ๊ฑด์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ค‘์ง€ํ•˜๊ธฐ ์œ„ํ•ด future๊ฐ€ Unpin ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// where Foo: Future + !Unpin
let mut foo: Box<Foo> = ...;
Pin::new(&mut foo).poll(cx);
let mut foo = Box::new(*foo);
Pin::new(&mut foo).poll(cx);

Box ๋Š” Unpin ์ด๊ณ  ์—ฌ๊ธฐ์—์„œ ๊ฐ’์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํž™ ์œ„์น˜์—์„œ ๋ฏธ๋ž˜๋ฅผ ํ•œ ๋ฒˆ ํด๋งํ•œ ๋‹ค์Œ, ๋ฏธ๋ž˜๋ฅผ ์ƒ์ž์—์„œ ๊บผ๋‚ด ์ƒˆ ํž™ ์œ„์น˜์— ๋„ฃ๊ณ  ํด๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ.

await๋Š” ๋ฏธ๋ž˜๋ฅผ ์†Œ๋น„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Box<dyn Future> ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํŠน์ˆ˜ ์ผ€์ด์Šค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

IntoFuture ํŠน์„ฑ์ด await! ๋Œ€ํ•ด ๋ถ€ํ™œํ•ด์•ผ ํ• ๊นŒ์š”? Box<dyn Future> ๋Š” Pin<Box<dyn Future>> ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async/await์— ๋Œ€ํ•œ ๋‹ค์Œ ๋ฒ„๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. async fn ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์—์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๋ก ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/ ๋ฌธ์ œ/60414

์ž ์žฌ์ ์œผ๋กœ #60414๋ฅผ top-post์˜ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„(์•„์ง ์‚ฌ์šฉ ์ค‘์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ github ๋ ˆ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„๊นŒ์š”?) "Resolution of rust-lang/ rfcs#2418โ€์€ IIRC Future ํŠธ๋ ˆ์ž‡์ด ์ตœ๊ทผ ์•ˆ์ •ํ™”๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒดํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐฉ๊ธˆ Reddit ํฌ์ŠคํŠธ์—์„œ ์™”๊ณ  ๋‚˜๋Š” postfix ๊ตฌ๋ฌธ์„ ์ „ํ˜€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Reddit์˜ ๋Œ€๋‹ค์ˆ˜๋„ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฐจ๋ผ๋ฆฌ ์“ด๋‹ค

let x = (await future)?

๊ทธ ์ด์ƒํ•œ ๊ตฌ๋ฌธ์„ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ๋ณด๋‹ค.

์—ฐ๊ฒฐ์— ๊ด€ํ•ด์„œ๋Š” 1 await ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฏธ๋ž˜์˜ JavaScript๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( ์Šค๋งˆํŠธ ํŒŒ์ดํ”„๋ผ์ธ ์ œ์•ˆ ).

const x = promise
  |> await #
  |> x => x.foo
  |> await #
  |> x => x.bar

await ์ ‘๋‘์‚ฌ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ await ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

@KSXGitHub ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ด ํ† ๋ก ์„ ์œ„ํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋…ผ๋ฆฌ๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ˆ˜๊ฐœ์›”์— ๊ฑธ์ณ ์ƒ๊ฐํ•œ ๋งค์šฐ ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://boats.gitlab.io/blog/post /๊ฒฐ์ •์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค/

@KSXGitHub ์ตœ์ข… ๊ตฌ๋ฌธ๋„ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์ง€๋งŒ #57640, https://internals.rust-lang.org/t/await-syntax-discussion-summary/ , https://internals.rust- ์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋””์ž์ธ ๊ฒฐ์ •์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด ๋ช…์‹œ์ ์ธ ๋ชฉ์ ์„ ์œ„ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ ๊ณ„ํš์ด๋ผ๋ฉด ํ† ๋ก ์ด ์ด๋ฏธ ๊ฝค ์ง„ํ–‰๋˜์—ˆ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•  ๋ง์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์Šค๋ ˆ๋“œ์—์„œ ์ด์ „์— ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

@withoutboats ์ตœ์ข… ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์™„๋ฃŒ๋กœ ํ‘œ์‹œํ•  ๋•Œ๊ฐ€ ๋˜์—ˆ๋‚˜์š”? :๋ถ‰ํžˆ๋‹ค:

7์›” 4์ผ์˜ ๋‹ค์Œ ๋ฒ ํƒ€ ์ปท์— ๋งž์ถฐ ์•ˆ์ •ํ™”ํ•˜๋ ค๋Š” ์˜๋„์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ๋ฅผ ์ฐจ๋‹จํ•˜๋ ค๋ฉด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋˜ ๋‹ค๋ฅธ ์ฃผ๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? A-async-await ํƒœ๊ทธ ์•„๋ž˜์—๋Š” ๋งŽ์€ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ ์ค‘ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„, ๋ฌด์‹œ ํ•˜์„ธ์š” . ๋ฐฉ๊ธˆ

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ! ์ด ๊ธฐ๋Šฅ์˜ ์•ˆ์ •์ ์ธ ์ถœ์‹œ๋ฅผ ์–ธ์ œ ์˜ˆ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ์•ผ๊ฐ„ ๋นŒ๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@MehrdadKhnzd https://github.com/rust-lang/rust/issues/62149 ์—๋Š” ๋ชฉํ‘œ ๋ฆด๋ฆฌ์Šค ๋‚ ์งœ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

async fn ์˜ํ•ด ์ƒ์„ฑ๋œ ์„ ๋ฌผ์— ๋Œ€ํ•ด Unpin ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํŠนํžˆ ์ƒ์„ฑ๋œ Future ์ฝ”๋“œ ์ž์ฒด๋กœ ์ธํ•ด Unpin์„ ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š”์ง€ ๋˜๋Š” ์ฐธ์กฐ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@DoumanAsh async fn์— yield point์—์„œ ํ™œ์„ฑ ์ž์ฒด ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๋œ Future๊ฐ€ Unpin์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„?

"_์ด_ ์ฐจ์šฉ์œผ๋กœ ์ธํ•ด Unpin ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค." + "๋Œ€์•ˆ์œผ๋กœ ์ด ๋ฏธ๋ž˜๋ฅผ ์ƒ์ž์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ํžŒํŠธ์™€ ํ•จ๊ป˜ ๊ฝค ์œ ์šฉํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

#63209์˜ ์•ˆ์ •ํ™” PR์—๋Š” "๋ชจ๋“  ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์ด์ œ ๋‹ซํž™๋‹ˆ๋‹ค."๋ผ๊ณ  ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  8์›” 20์ผ์— ์•ผ๊ฐ„์— ์ฐฉ๋ฅ™ํ•˜์—ฌ ์ด๋ฒˆ ์ฃผ ํ›„๋ฐ˜์— ๋ฒ ํƒ€ ์ปท์œผ๋กœ ํ–ฅํ–ˆ์Šต๋‹ˆ๋‹ค. 8์›” 20์ผ ์ดํ›„ ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์ฐจ๋‹จ ๋ฌธ์ œ๊ฐ€ ์ œ๊ธฐ๋˜์—ˆ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(AsyncAwait-Blocking ํƒœ๊ทธ๋กœ ์ถ”์ ). ์ด ์ค‘ ๋‘ ๊ฐœ(#63710, #64130)๋Š” ์‹ค์ œ๋กœ ์•ˆ์ •ํ™”๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ์ข‹์€ ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ(#64391, #64433, #64477)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ›„์ž์˜ ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ๊ด€๋ จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ AsyncAwait-Blocking ๋ฌธ์ œ #63832๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ถœ๋œ PR #64292๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. PR #64584๋Š” ์ด๋ฏธ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๋„์— ์ฐฉ์ˆ˜ํ–ˆ์ง€๋งŒ ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ํ˜„์žฌ๋กœ์„œ๋Š” ๋ฏธํ•ด๊ฒฐ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์€์ƒ‰์€ ์„ธ ๊ฐ€์ง€ ์‹ฌ๊ฐํ•œ ๊ฐœ๋ฐฉํ˜• ์ฐจ๋‹จ๊ธฐ ๊ฐ€ ์ปดํŒŒ์ผ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค, ๋˜ ๋‹ค๋ฅธ์ฃผ๊ธฐ (์œ„ํ•ด ์•ผ๊ฐ„์— ๊ตฌ์›Œํ•œ๋‹ค ๊ฒฐ๊ตญ).

@bstrie ์šฐ๋ฆฌ๋Š” "๋†’์€ ์šฐ์„  ์ˆœ์œ„"๋กœ ํ‘œ์‹œํ•  ๋” ๋‚˜์€ ๋ ˆ์ด๋ธ”์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— "AsyncAwait-Blocking"์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜ผ๋™์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ณง ๋ผ๋ฒจ๋ง ์‹œ์Šคํ…œ์„ ๊ฐœ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @nikomatsakis ์ฐธ์กฐ.

... ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค... 1.38์—์„œ async-await๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. 1.39๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ช‡ ๊ฐ€์ง€ "๋ฌธ์ œ"๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค...

@earthengine ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ƒํ™ฉ์— ๋Œ€ํ•œ ๊ณต์ •ํ•œ ํ‰๊ฐ€๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ธฐ๋œ ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋ถ€๋”ชํž ๋•Œ๊นŒ์ง€ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ฐฉ๋ฅ™ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰