์ด๊ฒ์ ์ธ์ด์ async ๋ฐ await ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ RFC 2394(rust-lang/rfcs#2394)์ ์ถ์ ๋ฌธ์ ์ ๋๋ค.
์ ๋ ์ด RFC์ ๊ตฌํ ์์ ์ ์ฃผ๋ํ ๊ฒ์ด์ง๋ง Rustc์์ ์์ ํ ๊ฒฝํ์ด ์๋์ ์ผ๋ก ์ ๊ธฐ ๋๋ฌธ์ ๋ฉํ ๋ง์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
ํ ๊ฒ:
ํด๊ฒฐ๋์ง ์์ ์ง๋ฌธ:
await
์ต์ข
๊ตฌ๋ฌธ.Try
๊ตฌํ์ ๋ค์ ํ์ธํฉ๋๋ค.์ฌ๊ธฐ์์ ๋
ผ์๊ฐ ๋๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ฌ๊ธฐ์ 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@?
์์์ ๊ฐ์ด ?
์ ๊ฐ์ ์ ์ธ์ฅ์ ์ฌ์ฉํ์ญ์์ค(์ด๊ฒ์ "๋ผ์ธ ๋
ธ์ด์ฆ"์
๋๋ค).์ฆ ๊ฐ์ง ์์ต๋๋ค ๋งํ๋ค
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
ํ ์ ์์ต๋๋ค. ์ฌ์ฉ ์ธก๋ฉด์์ ์์์ ๋ณํ์ ํ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์๋ฏธ๊ฐ ์์ต๋๋ค.
Future<T>
์ด๊ฑฐ๋ T
์์ฒด๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ณ ์์ํด์ผ ํฉ๋๋ค. ํค์๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์กด์ฌํ๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ T
์ด๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด Future<T>
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์ ํด๋นํฉ๋๋ค.
์ด๊ฒ์ ์ด๋ฏธ ์ผ๋ฐ ๋๊ธฐํ ์ฝ๋์ ํด๋ก์ ์ ํด๋น๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด:
์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค.
await
์ฉ await
์๋ ์ปจํ
์คํธ๊ฐ ์๊ณ async
์๋ ์ปจํ
์คํธ๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ ์๋ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ์ฝ๋์ ๋ํด ๋ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์น๋ฆฌํฉ๋๋ค.async
ํจ์๋ ์๋นํ ํฌ๊ณ (์ผ๋ฐ ํจ์๋งํผ ํฌ๋ฉฐ) ๋ณต์กํ ์ ์์ต๋๋ค.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
๊ฐ ๋ก๋์ ์ฑ๋ฅ ์ ๋ฐ์ ๊ฑธ์ณ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ํ์๋ก ์์ฃผ ๋ด
๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ์ด์ ๊ฒํ ํ ์ฝ๋์
๋๋ค(์ฝ๋๋ ์ฐจ์ ์ฑ
์ด์ง๋ง ๊ฒํ ๋ฐ๋ณต ์ค ํ๋์).
๋ณด์๋ค์ํผ ์ฌ๊ธฐ์์ ๋ฃจํ์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ ์ฝ๊ฒ ๋ฐ๊ฒฌํ๊ณ ๋ณ๊ฒฝ์ ์์ฒญํ์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ด ์ปค๋ฐ๋์์ ๋ ํ์ด์ง ๋ก๋ ์๋๊ฐ 3๋ฐฐ ํฅ์๋์์ต๋๋ค. await
์์ด๋ ์ด ์๋ชป๋ ํ๋์ ์ฝ๊ฒ ๊ฐ๊ณผํ ์ ์์ต๋๋ค.
๋๋ Kotlin์ ์ฌ์ฉํ์ง ์์๋ค๋ ๊ฒ์ ์ธ์ ํ์ง๋ง ์ง๋๋ฒ์ ๊ทธ ์ธ์ด๋ฅผ ๋ณด์์ ๋ ๊ธฐ๊ณ์ ์ผ๋ก ํ๋๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ฒ์ญํ๊ธฐ ์ฌ์ด ์ง์ ๊น์ง ๊ตฌ๋ฌธ์ด ์ ์ Java์ ๋ณํ์ธ ๊ฒ ๊ฐ์์ต๋๋ค. ๋๋ ๋ํ ๊ทธ๊ฒ์ด Java์ ์ธ๊ณ(์ฝ๊ฐ ๊ตฌ๋ฌธ์ด ๋ฌด๊ฑฐ์ด ๊ฒฝํฅ์ด ์์)์์ ์ ํธ๋๋ ์ด์ ๋ฅผ ์์ํ ์ ์์ผ๋ฉฐ, ํนํ Java๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ต๊ทผ์ ์ธ๊ธฐ๊ฐ ๋์์ก๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค(Oracle ๋ Google ์ํฉ ).
๊ทธ๋ฌ๋ ์ธ๊ธฐ๋์ ์น์๋๋ฅผ ๊ณ ๋ คํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด JavaScript๊ฐ ํ๋ ์ผ์ ์ดํด๋ณด๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ์ด๋ await
์ด๊ธฐ๋ ํฉ๋๋ค.
์ฆ, await
๋ C#์ ์ํด ์ฃผ๋ฅ ์ธ์ด์ ๋์
๋์์ต๋๋ค. C#์ ์ฌ์ฉ ํธ์์ฑ์ด ๊ฐ์ฅ ์ค์ํ๊ฒ ์ฌ๊ฒจ์ง๋ ์ธ์ด ์ค ํ๋์ผ ๊ฒ์
๋๋ค. C#์์ ๋น๋๊ธฐ ํธ์ถ์ await
ํค์๋๋ฟ๋ง ์๋๋ผ ๋ฉ์๋ ํธ์ถ์ Async
์ ๋ฏธ์ฌ๋ก๋ ํ์๋ฉ๋๋ค. await
, yield return
์ ๊ฐ์ฅ ๋ง์ด ๊ณต์ ๋๋ ๋ค๋ฅธ ์ธ์ด ๊ธฐ๋ฅ๋ ์ฝ๋์์ ๋๋๋ฌ์ง๊ฒ ๋ณผ ์ ์์ต๋๋ค.
์ ๊ทธ๋ฐ ๊ฒ๋๊น? ์ ์๊ฐ์ ์ ๋๋ ์ดํฐ์ ๋น๋๊ธฐ์ ํธ์ถ์ด ์ฝ๋์์ ๋์ ๋์ง ์๊ฒ ์ ๋ฌ๋๋๋ก ํ๊ธฐ์๋ ๋๋ฌด ๊ฐ๋ ฅํ ๊ตฌ์กฐ๋ผ๋ ๊ฒ์ ๋๋ค. ์ ์ด ํ๋ฆ ์ฐ์ฐ์์ ๊ณ์ธต์ด ์์ต๋๋ค.
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์์ ๋ค์ ๋ด๋ณด๋ด๊ธฐ๋ก ๊ตฌ์ฑ๋์ด ๊ฒฐ๊ณผ๊ฐ ์ฝ๊ฐ ... ์ฐจ์ ์ฑ . ์์ ํ๋๊ธฐ ์ ์ ์ด ๋ฌธ์ ๊ฐ ์ด๋ป๊ฒ๋ ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ๋ช ๊ฐ์ง ์ ์ ์ฌํญ์ด ์์ต๋๋ค.
UnsafePoll
ํธ๋ ์๊ณผ Poll
์ด๊ฑฐํ์ ์ด๋ฆ์ด ๋งค์ฐ ๋น์ทํ์ง๋ง ๊ด๋ จ์ด ์์ต๋๋ค. ๋๋ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข์ต๋๋ค UnsafePoll
๋ก, ์๋ฅผ UnsafeTask
.task.rs
ํจ๊ป ๋ฌถ์ฌ ํ์ํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค. ๋ค์ ๋ถํ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.TaskObj#from_poll_task()
์ ์ด์ํ ์ด๋ฆ์ด ์์ต๋๋ค. ์ด๋ฆ์ new()
์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.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 ํ๋ก์ ํธ๋ฅผ ์ํด ์ผ๋ถ ์ค๊ดํธ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ํจ์๊ฐ ์๋ช ์ ๋ํด ์ธ๋ถ ๋ฐํ ์ ํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋ํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ง๋ค์์ต๋๋ค. ๋ ์๋ฅผ ์ฆ๊ธฐ์ญ์์ค!
๋๋ ๋ชจ๋ ํ ๋ก ์ ๋ฐ๋ฅด์ง ์์์ผ๋ฏ๋ก, ๋ด๊ฐ ๋์ณค๋ค๋ฉด ์ด๋ฏธ ๋ ผ์๋์์ ์์น๋ฅผ ์์ ๋กญ๊ฒ ์ง์ ํด ์ฃผ์ญ์์ค.
๋ค์์ ๋ด๋ถ ๋ฐํ ์ ํ ์ ๊ทผ ๋ฐฉ์์ ๋ํ ์ถ๊ฐ ๊ด์ฌ์ฌ์
๋๋ค. 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.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๋ฅผ ์์ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ ์ ์์
์ด ํ์ํ ์ถ์
ํ ํดํน์ ์์๋์ต๋๋ค.
์ด์์ ์ผ๋ก๋ 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
๋ํ ๋งคํฌ๋ก๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ตฌํ๋ ๋งคํฌ๋ก๋ก ์ ์ง๋ ์ ์๋ค๊ณ ์๊ฐํ์ง ์๋๋ค๊ณ ๋งํ์ต๋๋ค(์ฌ์ฉ์์๊ฒ ๊ณ์ ๋งคํฌ๋ก๋ก ํ์๋๋์ง ์ฌ๋ถ๋ ๋ฌด์). ์ด์ ๋ฅผ ํ์ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
|| await!()
๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๊ธฐ๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ๋งํ๋ฉด์ ๊ธฐ๋ณธ ๊ตฌํ์ ์จ๊น๋๋ค.yield
์ ์ถ๊ฐ await
๋ค๋ฅธ yield
์ ์ฌ์ฉ์์ ์ํด ์์ฑ๋. ์ด๊ฒ์ ์ฌ์ ๋งคํฌ๋ก ํ์ฅ ๋จ๊ณ๋ก ์ํ๋ ์ _๊ฐ๋ฅํฉ๋๋ค. _if_ ์ฌ์ฉ์๋ ๋งคํฌ๋ก ๋ด๋ถ์์ yield
์ํ์ง ์์์ง๋ง yield_from!
์ ๊ฐ์ ๋งคํฌ๋ก ๋ด๋ถ ๊ตฌ์กฐ์๋ ๋งค์ฐ ์ ์ฉํ yield
. . ๋งคํฌ๋ก์์ yield
๊ฐ ์ง์๋์ด์ผ ํ๋ค๋ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์ธํด await!
๋ ์ต์ํ ๋ด์ฅ ๋งคํฌ๋ก๊ฐ ๋์ด์ผ ํฉ๋๋ค(์ค์ ๊ตฌ๋ฌธ์ด ์๋ ๊ฒฝ์ฐ).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 ์ํ๊ณ์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ์ ๋ฏธ์ฌ์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ ์ ๋ฏธ์ฌ ๊ตฌ๋ฌธ์ด ์ธ๊ธ๋์์ต๋๋ค. ๊ทธ ์ค ์ผ๋ถ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
foo.await!()
-- ์ด๊ฒ์ ์ ๋ฏธ์ฌ ๋งคํฌ๋ก ์๋ฃจ์
์
๋๋ค. ๋๋ ํ์ ๋งคํฌ๋ก์ ์ฐฌ์ฑ ๊ฐํ๊ฒ ํด์ ๋์, ๋๋๊ฐ ๋์์ @cramertj์ https://github.com/rust-lang/rust/issues/50547#issuecomment -454225040 ์ฐ๋ฆฌ๋ ๋ํ ํ์์ ํฌ์
ํ์ง ์๋ ํ ์ฐ๋ฆฌ๋์ด ์์
์ ์ํํด์๋ ์ ์ผ๋ฐ์ ์ผ๋ก ๋งคํฌ๋ก. ๋๋ ๋ํ ์ด๋ฐ ์์ผ๋ก ์ ๋ฏธ์ฌ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ค์ ๋น์ผ๋ฅ์ ์ธ ๋๋์ ์ค๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋งคํฌ๋ก ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ์ธ์ด ๊ตฌ์ฑ์ ํผํด์ผ ํฉ๋๋ค.
foo await
-- ์ด๊ฒ์ ๊ทธ๋ฆฌ ๋์์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก ํ์ ์ฐ์ฐ์( expr op
)์ฒ๋ผ ์๋ํ์ง๋ง ์ด ํ์์ ๋ญ๊ฐ ๋น ์ง ๊ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค(์ฆ, "๋น" ๋๋). ๋์กฐ์ ์ผ๋ก expr?
?
๋ฅผ expr
์ง์ ์ฒจ๋ถํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ณต๊ฐ์ด ์์ต๋๋ค. ์ด๊ฒ์ ?
๋ฅผ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ผ๋ก ๋ณด์ด๊ฒ ํฉ๋๋ค.
foo.await
-- ์ด๊ฒ์ ํ๋ ์ก์ธ์ค์ฒ๋ผ ๋ณด์ธ๋ค๋ ๋นํ์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฌ์ค์
๋๋ค. ๊ทธ๋ฌ๋ await
๋ ํค์๋์ด๋ฏ๋ก ๊ตฌ๋ฌธ์ด ๊ฐ์กฐ ํ์๋๋ค๋ ์ ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. IDE์์ ๋๋ ์ด์ ์์ํ๋ GitHub์์ Rust ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒฝ์ฐ await
๋ foo
์ ๋ค๋ฅธ ์์์ด๋ ๊ตต๊ฒ ํ์๋ฉ๋๋ค. ๋ค๋ฅธ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ ์์ฐํ ์ ์์ต๋๋ค.
let x = foo.match?;
๊ด๋ก์ ์ผ๋ก ํ๋๋ ๋ช
์ฌ์ธ ๋ฐ๋ฉด await
๋ ๋์ฌ์
๋๋ค.
foo.await
์ ๋ํ ์ด๊ธฐ ์กฐ๋กฑ ์์๊ฐ ์์ง๋ง ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ด๋ฉด์ ์ฝ์ ์ ์๋ ๊ตฌ๋ฌธ์ผ๋ก ์ง์งํ๊ฒ ๊ณ ๋ คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ณด๋์ค๋ก .await
์ฌ์ฉํ๋ฉด IDE์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ ํ๋ ์ ๊ณผ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค (56ํ์ด์ง ์ฐธ์กฐ). ์๋ฅผ ๋ค์ด foo.
์ธ ์ ์์ผ๋ฉฐ foo
๊ฐ ๋ฏธ๋์ผ ๊ฒฝ์ฐ await
๊ฐ ์ฒซ ๋ฒ์งธ ์ ํ์ผ๋ก ํ์๋ฉ๋๋ค. ์ ์ ๋๋ฌํ๋ ๊ฒ์ ๋ง์ ๊ฐ๋ฐ์๊ฐ ๊ทผ์ก ๊ธฐ์ต์ ๋ํด ํ๋ จํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ์ธ์ฒด ๊ณตํ ๋ฐ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ๋ชจ๋ ์ด์งํฉ๋๋ค.
๊ฐ๋ฅํ ๋ชจ๋ ์ ๋ฏธ์ฌ ๊ตฌ๋ฌธ์์ ํ๋ ์ก์ธ์ค์ฒ๋ผ ๋ณด์ธ๋ค๋ ๋นํ์๋ ๋ถ๊ตฌํ๊ณ ์ด๊ฒ์ด ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ตฌ๋ฌธ์ผ๋ก ๋จ์ ์์ต๋๋ค.
foo#
-- #
๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด foo
ํฉ๋๋ค. ?
๋ ์ธ์ฅ์ด๊ณ awaiting ๊ฒฝ๋์ด๊ธฐ ๋๋ฌธ์ ์ธ์ฅ์ ๊ณ ๋ คํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ?
์ ๊ฒฐํฉํ๋ฉด foo#?
์ฒ๋ผ ๋ณด์
๋๋ค. ๊ด์ฐฎ์ ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ #
์๋ ํน๋ณํ ๊ทผ๊ฑฐ๊ฐ ์์ต๋๋ค. ์คํ๋ ค ์์ง ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ์ฅ์ผ ๋ฟ์
๋๋ค.
foo@
-- ๋ ๋ค๋ฅธ ์ธ์ฅ์ @
์
๋๋ค. ?
์ ๊ฒฐํฉํ๋ฉด foo@?
๋ฉ๋๋ค. ์ด ํน์ ์ธ์ฅ์ ๋ํ ํ ๊ฐ์ง ์ ๋น์ฑ์ a
-ish ( @wait
)๋ก ๋ณด์ธ๋ค๋ ๊ฒ์
๋๋ค.
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
ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์์ฑ๊ธฐ์ ?
์
๋๊น?
๋ง์ง๋ง ๊ดํธ ์์ ๋ฐ์ธ์ ์ค์ ๋ก ์คํ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๊ฒ ํฉ๋๋ค. ๋น ๋ฅธ ์ค์ผ์น๋ฅผ ๋ณด๋ ค๋ฉด ํด๋ฆญํ์ธ์.
์์ฑ๊ธฐ ๋ด์์ `foo?`๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ผ๋ก ํ์ฅ๋ฉ๋๋ค(์ด๊ฒ์ ์์ ๊ถ ๋ฌธ์ ๊ฐ ์๊ณ `foo`์ ๊ฒฐ๊ณผ๋ ์คํ ๊ณ ์ ํด์ผ ํจ).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>;
}
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
๊ตฌ๋ฌธ์ ๋ํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑ
foo await
๋ foo@
์ ๊ฐ์ ์ผ๋ถ ๊ธฐํธ๋ณด๋ค ๋ถ๊ธฐ๊ฐ ์ ์). ๊ทธ๋ฌ๋ ๋ชจ๋ ์ ๋์ด๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๋ณด๋ค ๋ ๋ค์ํฉ๋๋ค.!
์ฌ์ฉํ์ง ์๋ ๊ตฌ๋ฌธ์ ์์ ํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. async/await๋ฅผ ๋ค๋ฃจ๋ ๋ชจ๋ ์ฌ์ฉ์๋ ์ await๊ฐ ์ผ๋ฐ์ ์ธ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ๊ฐ ์๋ ๋งคํฌ๋ก์ธ์ง ๊ถ๊ธํด ํ ๊ฒ์
๋๋ค. ์ ๋ ์ฌ๊ธฐ์ ์ด์ผ๊ธฐ๊ฐ ๋ณธ์ง์ ์ผ๋ก "๊ธ์ ์ฐ๋ฆฌ๋ ์ข์ ๊ตฌ๋ฌธ์ ์์๋ผ ์ ์์ด์ ๊ทธ๋ฅ ๋งคํฌ๋ก์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค." ์ด๊ฒ์ ์ค๋๋ ฅ ์๋ ๋๋ต์ด ์๋๋๋ค. ๋๋ ์ฌ์ด์ ์ฐ๊ด ์๊ฐํ์ง ์๋๋ค !
๋ฐ ์ ์ด ํ๋ฆ์ด ์ ๋ง๋ก ์ถฉ๋ถ์ด ๊ตฌ๋ฌธ์ ์ ๋นํํ๋ ๊ฒ์
๋๋ค : ๋ด๊ฐ ๋ฏฟ๋ !
์ด์๋์ด ๊ฝค ํนํ ํ๊ท ๋งคํฌ๋ก expension.?
์ ์ฝ๊ฐ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ฉด awaiting์ ๋ ๋น์ผ ์์
์ด๊ธฐ ๋๋ฌธ์
๋๋ค(๋จ์ง ๋ถ๊ธฐํ๊ณ ํ ๋ฒ ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ ์ค๋น๊ฐ ๋ ๋๊น์ง ๋ฃจํ์์ ์๋ณดํฉ๋๋ค). ๋จ์ผ ํํ์์์ ๋์ธ ๋ฒ ๋๊ธฐํ๋ ์ฝ๋๊ฐ ์์ฌ์ค๋ฝ์ต๋๋ค. ์ด๊ฒ๋ค์ด ๊ทธ๋ค ์์ ์ let ๋ฐ์ธ๋ฉ์ผ๋ก ๋น๊ฒจ์ ธ์ผ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ๋์๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ try!
๋ ?
์ ์ถฉ์ ์ฌ๊ธฐ์์ ๋์๊ฒ ๊ฐ๋ ฅํ๊ฒ ๋น๊ธฐ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ํ ์ฌ๋๋ค์ด ์ค์ ๋ก let์ผ๋ก ๊บผ๋ด์๋ ์ ๋๋ฉฐ ๋ฉ์๋ ์ฒด์ธ์ผ๋ก ๋ ๋ช
ํํ๋ค๊ณ ์๊ฐํ๋ ์ฝ๋ ์ํ์ ๋ํด ์ด๋ ค ์์ต๋๋ค.์ฆ, foo await
๋ ์ง๊ธ๊น์ง ๋ณธ ๊ฒ ์ค ๊ฐ์ฅ ์คํ ๊ฐ๋ฅํ ์ ๋ฏธ์ฌ ๊ตฌ๋ฌธ์
๋๋ค.
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 ๋๋ ๊ทธ๊ฒ์ด ์ํฉ์ ๋ํ ๊ณต์ ํ ํ๊ฐ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ ๊ธฐ๋ ๋ฌธ์ ๋ ๋ชจ๋ ์ง์งํ๊ฒ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฌ๋๋ค์ด ์ค์ ๋ก ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ถ๋ชํ ๋๊น์ง ๋น๋๊ธฐ์์ผ๋ก ์ฐฉ๋ฅํ๋ ๊ฒ์ ์ข์ง ์์ ๊ฒ์ ๋๋ค. :)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ตฌ๋ฌธ ์ ๋ณด:
await
๋ฅผ ๋จ์ ํค์๋๋ก ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ธ๋ก๊ทธ์ ์ฐ๋ ค ์ฌํญ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.๋๋ ์ฌ๊ธฐ์ ๋์ํ์ง๋ง ์ค๊ดํธ๋ ๋์๋ค.
?
๊ฐawait
๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๋๋ด๋ ๊ฒ์ด ๋ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.์ฝ๊ธฐ๊ฐ ๋ ์ฝ๊ณ ๋ฆฌํฉํ ๋ง์ด ๋ ์ฝ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์์ ์ด ์คํ๋๋ ์์๋ฅผ ๋ ์ ์ดํดํ ์ ์์ง๋ง ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋๋ค.
await foo?
await
๋จผ์ ์คํํ๋ฉด ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ ์ดํ์ ์ผ๋ก ๋ ๋ฌถ์ฌ ์์ง๋งawait
๋ ์ผ์ชฝ์ ์๊ณ?
๋ ์ค๋ฅธ์ชฝ์ ์์ต๋๋ค. ๋ฐ๋ผ์await
๋จผ์ Result
๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ทธ ๋ค์์๊ฒฌ ๋ถ์ผ์น๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ํํํ์ฌ ๋ ผ์ํ ์ ์๋๋ก ํ์ญ์์ค. ๋๋ ์กฐ์ฉํ downvote๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๋ ๋ฌ์คํธ์๊ฒ ํ์ด์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.