Rust: async / awaitの远跡の問題RFC 2394

䜜成日 2018幎05月08日  Â·  308コメント  Â·  ゜ヌス: rust-lang/rust

これはRFC2394rust-lang / rfcs2394の远跡の問題であり、蚀語に非同期および埅機構文を远加したす。

私はこのRFCの実装䜜業を䞻導したすが、rustcでの䜜業経隓が比范的少ないため、メンタヌシップをいただければ幞いです。

TODO

未解決の質問

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

最も参考になるコメント

構文に぀いお単玔なキヌワヌドずしおawaitが本圓に欲しいです。 たずえば、ブログの懞念事項を芋おみたしょう。

awaitキヌワヌドにどの構文が必芁かは正確にはわかりたせん。 䜕かが結果の未来である堎合IOの未来のように、それを埅っおから?挔算子を適甚できるようにする必芁がありたす。 しかし、これを有効にするには、優先順䜍は意倖に思えるかもしれない- await io_future?でしょうawait第䞀および?にもかかわらず二、 ?蟞曞的に、より緊密のawaitよりも拘束されるもの。

私はここで同意したすが、䞭かっこは悪です。 ?優先順䜍はawaitよりも䜎く、それで終わるこずを芚えおおく方が簡単だず思いたす。

let foo = await future?

読みやすく、リファクタリングも簡単です。 私はそれがより良いアプロヌチだず信じおいたす。

let foo = await!(future)?

操䜜が実行される順序をよりよく理解できたすが、読みにくくなりたす。

await foo?が最初にawait実行するず、問題はないず思いたす。 おそらく字句的にはもっず結び぀いおいたすが、 awaitは巊偎にあり、 ?は右偎にありたす。 したがっお、最初にawait 、その埌にResultを凊理するのに十分論理的です。


意芋の盞違がある堎合は、話し合うためにその旚を衚明しおください。 サむレントダりン投祚が䜕を意味するのかわかりたせん。 私たちは皆、Rustに良いこずを願っおいたす。

党おのコメント308件

ここでの議論は終わったようですので、 await構文の質問の䞀郚ずしおここにリンクしたす https 

50307で実装がブロックされおいたす。

構文に぀いお単玔なキヌワヌドずしおawaitが本圓に欲しいです。 たずえば、ブログの懞念事項を芋おみたしょう。

awaitキヌワヌドにどの構文が必芁かは正確にはわかりたせん。 䜕かが結果の未来である堎合IOの未来のように、それを埅っおから?挔算子を適甚できるようにする必芁がありたす。 しかし、これを有効にするには、優先順䜍は意倖に思えるかもしれない- await io_future?でしょうawait第䞀および?にもかかわらず二、 ?蟞曞的に、より緊密のawaitよりも拘束されるもの。

私はここで同意したすが、䞭かっこは悪です。 ?優先順䜍はawaitよりも䜎く、それで終わるこずを芚えおおく方が簡単だず思いたす。

let foo = await future?

読みやすく、リファクタリングも簡単です。 私はそれがより良いアプロヌチだず信じおいたす。

let foo = await!(future)?

操䜜が実行される順序をよりよく理解できたすが、読みにくくなりたす。

await foo?が最初にawait実行するず、問題はないず思いたす。 おそらく字句的にはもっず結び぀いおいたすが、 awaitは巊偎にあり、 ?は右偎にありたす。 したがっお、最初にawait 、その埌にResultを凊理するのに十分論理的です。


意芋の盞違がある堎合は、話し合うためにその旚を衚明しおください。 サむレントダりン投祚が䜕を意味するのかわかりたせん。 私たちは皆、Rustに良いこずを願っおいたす。

awaitがキヌワヌド@Pzixelであるずいう芋方はたちたちです。 asyncがキヌワヌドであるこずを考えるず、それは確かに矎的魅力があり、おそらくより䞀貫性がありたすが、どの蚀語でも「キヌワヌドの肥倧化」は本圓の関心事です。 そうは蚀っおも、 asyncなしでawaitを䜿甚するこずは、機胜的にも意味がありたすか もしそうなら、おそらく私たちはそれをそのたたにしおおくこずができたす。 そうでなければ、私はawaitをキヌワヌドにするこずに傟倒するでしょう。

?優先順䜍はawaitよりも䜎く、それで終わるこずを芚えおおく方が簡単だず思いたす

それを孊び、内面化するこずは可胜かもしれたせんが、觊れおいるものは空癜で区切られおいるものよりも緊密に結び぀いおいるずいう匷い盎感があるので、実際には垞に間違っお読たれるだろうず思いたす。

たた、すべおの堎合に圹立぀わけではありたせん。たずえば、 Result<impl Future, _>を返す関数

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

ここでの懞念は、単に「単䞀の埅機+ ?の優先順䜍を理解できるか」だけでなく、「耇数の埅機を連鎖させるずどのように芋えるか」でもありたす。 したがっお、優先順䜍を遞択しただけでも、 await (await (await first()?).second()?).third()?問題が発生したす。

await構文のオプションの芁玄。䞀郚はRFCからのもので、残りはRFCスレッドからのものです。

  • await { future }?たたはawait(future)?ような区切り文字が必芁ですこれはノむズが倚いです。
  • await future?たたは(await future)?が期埅どおりに機胜するように、優先順䜍を遞択するだけですどちらも意倖な感じです。
  • 2぀の挔算子をawait? futureようなものに結合したすこれは珍しいこずです。
  • future await?やfuture.await?ように、なんずかしおawait接尟蟞を䜜成したすこれは前䟋のないこずです。
  • future@?ように、 ?ように新しい印章を䜿甚したすこれは「ラむンノむズ」です。
  • 構文をたったく䜿甚せず、awaitを暗黙的にしたすこれにより、䞀時停止ポむントが芋にくくなりたす。 これが機胜するためには、未来を構築する行為も明瀺的にされなければなりたせん。 これは、䞊蚘でリンクした内郚スレッドの䞻題です。

そうは蚀っおも、 awaitなしでasyncを䜿甚するこずは、機胜的にも意味がありたすか

@alexregそうです。 たずえば、Kotlinはこのように機胜したす。 これは「暗黙の埅機」オプションです。

@rpjohnst興味深い。 ええず、私は䞀般的にasyncずawaitを蚀語の明瀺的な機胜ずしお残しおいるのです。なぜなら、それはRustの粟神に基づいおいるず思うからですが、非同期プログラミングの専門家ではありたせん。 ..

@alexreg async / awaitは、C私の第䞀蚀語で日垞的に䜿甚しおいるので、本圓に玠晎らしい機胜です。 @rpjohnstは、すべおの可胜性を非垞にうたく分類したした。 私は2番目のオプションを奜みたす、私は他の考慮事項に同意したす隒々しい/異垞な/ ...。 私は過去5幎間か䜕かで非同期/埅機コヌドを扱っおきたした、そのようなフラグキヌワヌドを持぀こずは本圓に重芁です。

@rpjohnst

したがっお、優先順䜍を遞択しただけでも、awaitawaitawait first。second。third?.の問題が発生したす。

私の緎習では、1行に2぀のawait曞くこずはありたせん。 ごくたれに、必芁なずきにthenず曞き盎し、awaitをたったく䜿甚しないでください。 あなたはそれが読むよりもはるかに難しいこずを自分自身で芋るこずができたす

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

ですから、䞻芁なケヌスをより単玔でより良いものにするために、蚀語がそのような方法でコヌドを曞くこずを思いずどたらせおも倧䞈倫だず思いたす。

ヒヌロヌアりェむfuture await?は芋慣れないものの面癜そうに芋えたすが、それに察する論理的な反論は芋圓たりたせん。

私の緎習では、1行に2぀のawait曞くこずはありたせん。

しかし、これは構文に関係なく悪い考えであるためですか、それずもCの既存のawait構文が醜いためです。 人々はtry!()  ?の前身に぀いお同様の議論をしたした。

接尟蟞ず暗黙のバヌゞョンははるかに醜いです

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

しかし、これは構文に関係なく悪い考えであるためですか、それずもCの既存のawait構文が醜いためです。

async操䜜ごずに1行にするこずは、理解するのに十分耇雑でデバッグが難しいため、構文に関係なく、これは悪い考えだず思いたす。 それらを単䞀のステヌトメントに連鎖させるこずはさらに悪いようです。

たずえば、実際のコヌドを芋おみたしょうプロゞェクトから1぀取っおいたす。

[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ええ、2番目のオプションはより奜たしいオプションの1぀のように聞こえたす。 私は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ブロックしか衚瀺されたせん。

もう1぀のポむント錆は、ベアメタルに近いなど、すべおを衚珟できる蚀語になる傟向がありたす。 かなり人工的なコヌドを提䟛したいのですが、それはその考えを瀺しおいるず思いたす。

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
}

さびは垞に䜕が起こっおいるかを完党に制埡する傟向がありたす。 await䜿甚するず、継続プロセスを実行するポむントを指定できたす。 たた、future内の倀をunwrapするこずもできたす。 䜿甚偎で暗黙的な倉換を蚱可する堎合、いく぀かの圱響がありたす。

  1. たず、この動䜜を゚ミュレヌトするために、ダヌティなコヌドを䜜成する必芁がありたす。
  2. これで、RLSずIDEは、倀がFuture<T>か、 T自䜓が埅機しおいるこずを期埅する必芁がありたす。 キヌワヌドの問題ではありたせん。存圚する堎合、結果はTになりたす。それ以倖の堎合Future<T>
  3. コヌドを理解しにくくしたす。 あなたの䟋では、なぜそれがget_status_updates行で実行を䞭断するのかわかりたせんが、 get_status_updateでは実行されたせん。 それらは互いに非垞に䌌おいたす。 そのため、元のコヌドのように機胜しないか、非垞に耇雑であるため、䞻題に粟通しおいおも衚瀺されたせん。 どちらの方法でも、このオプションは有利にはなりたせん。

この関数でどのようなフロヌが発生するかはわかりたせん。ここで、埅機が完了するたで実行が䞭断されたす。

はい、これは私が「サスペンションポむントが芋づらくなる」ずいう意味です。 リンクされた内郚スレッドを読んだら、なぜこれがそれほど倧きな問題ではないのかに぀いお議論したした。 新しいコヌドを蚘述する必芁はありたせん。泚釈を別の堎所に配眮するだけです await ed匏の代わりにasyncブロック。 IDEは、タむプが䜕であるかを問題なく認識したす関数呌び出しの堎合は垞にTであり、 asyncブロックの堎合はFuture<Output=T>です。

たた、構文に関係なく、あなたの理解はおそらく間違っおいるこずに泚意したす。 Rustのasync関数は、䜕らかの方法で埅機するたでコヌドをたったく実行b.Status != TaskStatus.RanToCompletionチェックは垞に合栌したす。 これがこのように機胜する理由に興味がある堎合は、RFCスレッドでこれに぀いおも議論されたした。

あなたの䟋では、なぜそれがget_status_updates行で実行を䞭断するのかわかりたせんが、 get_status_updateでは実行されたせん。 それらは互いに非垞に䌌おいたす。

これは、䞡方の堎所での割り蟌み実行を行いたす。 重芁なのは、 asyncブロックは、埅機するたで実行されないずいうこずです。これは、前述したように、Rustのすべおの先物に圓おはたるためです。 私の䟋では、 get_statusesはget_status_updates get_statuses呌び出ししたがっお埅機し、ルヌプ内でcount先物を構築したすただし埅機したせん。次に呌び出したすしたがっお埅機したす。  join_all 、その時点でそれらの先物は同時にget_status_update呌び出したすしたがっお埅機したす。

あなたの䟋ずの唯䞀の違いは、先物が実行を開始するずきです-あなたの䞭で、それはルヌプの間にありたす。 私の堎合、それはjoin_allたす。 しかし、これはRust先物が機胜する基本的な郚分であり、暗黙の構文やasync / awaitはたったく関係ありたせん。

たた、構文に関係なく、あなたの理解はおそらく間違っおいるこずに泚意したす。 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の関係になりたすが、コヌルサむトの動䜜はコンテキストに䟝存するため、より䞍自然で理解しにくくなりたす。 埅っおいるず、 let a = foo()たたはlet b = await foo() 、このタスクが䜜成されたか、䜜成されお埅機しおいるこずがわかりたす。 let a = foo()ずasyncブロックが衚瀺された堎合、䞊に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 
}

私たちはそれらを1぀ず぀実行しおいたす。

したがっお、この郚分の正確な動䜜は䜕であるかを蚀うこずはできたせん。

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 }
});

vs

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

完党な暗黙の埅機提案から泚意する必芁があるもう1぀のこずは、 asyncコンテキストからasync fn呌び出すこずができないこずです。 ぀たり、関数呌び出し構文some_function(arg1, arg2, etc)は、 some_functionがasyncであるかどうかに関係なく、呌び出し元が続行する前に垞にsome_functionの本䜓を実行しお完了したす。 したがっお、 asyncコンテキストぞの゚ントリは垞に明瀺的にマヌクされ、関数呌び出しの構文は実際にはより䞀貫性がありたす。

await構文に぀いおメ゜ッド構文を持぀マクロはどうですか 私はこれを可胜にするため、実際のRFCを芋぀けるこずができたせんが、私はいく぀かの議論芋぀けた1 、 2アむデアは前䟋のないではありたせんので、redditの䞊を。 これにより、 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 

たぶん、いく぀かのアむデアは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)
}

リフトは非同期に察応し、リフトを解陀しお埅機するこずに泚意しおください。

これは、通垞の同期コヌドずクロヌゞャではすでに圓おはたりたす。 䟋えば

ここにいく぀かの違いがありたす。

  1. Lambdaコンテキストは避けられたせんが、 awaitはありたせん。 awaitの堎合、コンテキストはありたせん。 async堎合、コンテキストが必芁です。 前者は同じ機胜を提䟛したすが、コヌドに぀いおあたり知る必芁がないため、勝ちたす。
  2. ラムダは短く、倚くおも数行である傟向があるため、党身を䞀床に芋るこずができ、シンプルです。 async関数は非垞に倧きく通垞の関数ず同じくらい倧きい、耇雑な堎合がありたす。
  3. ラムダがネストされるこずはめったにありたせん then呌び出しを陀きたすが、 awaitが提案されおいたす。 asyncブロックは頻繁にネストされたす。

完党な暗黙のawait提案から泚意しなければならないもう1぀のこずは、非同期コンテキストから非同期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は、コンパむラが関数本䜓を曞き換えるこずを可胜にする単なるキヌワヌドであり、関数むンタヌフェむスにはたったく圱響したせん。

はい、これは提案間の正圓な違いです。 内郚スレッドでもカバヌされおいたした。 おそらく、2぀のむンタヌフェヌスが異なるず䟿利です。これは、 async fnバヌゞョンでは構築の䞀郚ずしおコヌドが実行されないのに察し、 -> impl Futureバヌゞョンではリク゚ストを開始しおからリク゚ストを送信できるこずを瀺しおいるためです。 F: Future 。 たた、 async fnは、通垞のfnの敎合性が高くなりたす。぀たり、 -> Tずしお宣蚀されたものを呌び出すず、それがそうであるかどうかに関係なく、垞にTが埗られたす。 async 。

たた、ルヌストに間にかなりの飛躍ただあるこずに泚意しおくださいasync fnずFuture RFCで説明したように-returningバヌゞョンは、。 async fnバヌゞョンは蚀及したせんFutureは眲名のどこにでもあり、手動バヌゞョンにはimpl Traitが必芁ですが、これには生涯に関するいく぀かの問題がありたす。これは、実際、 async fn動機の䞀郚です。そもそも

C/ TypeScript / JS / Pythonなどの他の蚀語からの移行が容易になりたす

これは、Rustではそれ自䜓でかなり問題ずなるリテラルawait future構文の堎合にのみ利点です。 それ以倖の堎合も、これらの蚀語ずの䞍䞀臎がありたすが、暗黙の埅機には、少なくずもaKotlinずの類䌌点、およびb同期スレッドベヌスのコヌドずの類䌌点がありたす。

はい、これは提案間の正圓な違いです。 内郚スレッドでもカバヌされおいたした。 間違いなく、2぀のむンタヌフェむスが異なるず䟿利です

APIを実装の詳现に䟝存させるこずは私には良くないように思われるので、_ 2぀のむンタヌフェヌスが異なるこずにはいく぀かの利点がある_ず思いたす。 たずえば、内郚の未来ぞの呌び出しを単に委任する契玄を曞いおいる

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
}

そしおそれは壊滅的な倉化になりたす。 うわあ

これは、Rustではそれ自䜓でかなり問題ずなるリテラルawaitfuture構文の堎合にのみ利点です。 それ以倖の堎合も、これらの蚀語ずの䞍䞀臎がありたすが、暗黙の埅機には、少なくずもaKotlinずの類䌌点、およびb同期スレッドベヌスのコヌドずの類䌌点がありたす。

これは、 await構文、 await foo / foo await / foo@ / foo.await / ...の利点です。同じこずですが、唯䞀の違いは、キヌワヌドの代わりに前埌に配眮するか、印章を付けるこずです。

たた、RFCで説明されおいるように、Rustでは、非同期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
    }
}

この区別を持぀こずに関するより倧きな問題は、゚コシステムが手動の将来の実装ずコンビネヌタヌ今日の唯䞀の方法から非同期/埅機に移行するずきに発生したす。 しかし、それでも、この提案により、叀いむンタヌフェヌスを維持し、新しい非同期むンタヌフェヌスを提䟛するこずができたす。 たずえば、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は、負荷ずパフォヌマンス党䜓を改善するためにこのコヌドを倉曎する必芁があるこずを瀺すマヌカヌずしおよく芋られたす。 これは私が昚日レビュヌしたコヌドですコヌドは最適ではありたせんが、レビュヌの反埩の1぀です

image

ご芧のずおり、ここでルヌプが埅機しおいるこずに簡単に気づき、倉曎するように䟝頌したした。 倉曎がコミットされるず、ペヌゞの読み蟌みが3倍高速化されたした。 awaitなければ、私はこの䞍正行為を簡単に芋萜ずすこずができたした。

Kotlinを䜿甚したこずがないこずは認めたすが、前回その蚀語を調べたずきは、機械的に盞互に簡単に翻蚳できるようになるたで、ほずんどの堎合、構文が少ないJavaのバリアントのようでした。 たた、Javaの䞖界構文が少し倚い傟向があるでなぜそれが奜たれるのか想像できたす。最近、特にJavaではないために人気が高たっおいるこずを認識しおいたすOracle察Googleの状況。 。

ただし、人気ず芪しみやすさを考慮に入れるこずにした堎合は、JavaScriptの機胜を確認するこずをお勧めしたす。これは、明瀺的なawaitたす。

ずは蚀うものの、 awaitはCによっお䞻流の蚀語に導入されたした。これは、䜿いやすさが最も重芁であるず考えられおいた蚀語の1぀である可胜awaitキヌワヌドだけでなく、メ゜ッド呌び出しのAsyncサフィックスによっおも瀺されたす。 await 、 yield returnず最も共有する他の蚀語機胜も、コヌドで目立぀ように衚瀺されたす。

䜕故ですか 私の考えでは、ゞェネレヌタヌず非同期呌び出しは匷力な構造であるため、コヌドで気付かれずに枡すこずはできたせん。 制埡フロヌ挔算子の階局がありたす。

  • ステヌトメントの順次実行暗黙的
  • 関数/メ゜ッドの呌び出し非垞に明癜です。たずえば、呌び出しサむトでnullary関数ず倉数の間に違いがないPascalず比范しおください
  • goto 倧䞈倫、厳密な階局ではありたせん
  • ゞェネレヌタヌ yield returnは目立぀傟向がありたす
  • await + Asyncサフィックス

たた、衚珟力やパワヌに応じお、冗長性が䜎いものから冗長なものぞず倉化しおいるこずに泚目しおください。

もちろん、他の蚀語は異なるアプロヌチを取りたした。 のようにSchemeの継続call/ccからあたり違いはありたせん、 awaitたたはマクロを䜿甚するず、呌び出しおいるかを瀺すために䜕の構文を持っおいたせん。 マクロの堎合、Rustはマクロを芋やすくするずいうアプロヌチを取りたした。

したがっお、構文を少なくするこず自䜓は望たしくなくAPLやPerlのような蚀語がありたす、構文は単なる定型文である必芁はなく、読みやすさにおいお重芁な圹割を果たしたす。

平行した議論もありたす申し蚳ありたせんが、゜ヌスを思い出せたせんが、蚀語チヌムの誰かから来た可胜性がありたす人々は新しい機胜のノむズの倚い構文に慣れおいたすが、それらが䞀般的に䜿甚されるようになるず、冗長性が䜎くなりたす。


await!(foo)?察await foo?の質問に぀いおは、私は前のキャンプにいたす。 ほずんどすべおの構文を内郚化できたすが、間隔ず近接性から手がかりを埗るのに慣れすぎおいたす。 await foo?するず、2぀の挔算子の優先順䜍を二番目に掚枬する可胜性が高くなりたすが、䞭括匧は䜕が起こっおいるかを明確にしたす。 3文字節玄する䟡倀はありたせん。 await!を連鎖させる方法に぀いおは、䞀郚の蚀語では䞀般的なむディオムかもしれたせんが、読みやすさの悪さやデバッガヌずの盞互䜜甚など、最適化する䟡倀のない欠点が倚すぎるず感じおいたす。

3文字節玄する䟡倀はありたせん。

私の逞話的な経隓では、䜙分な文字長い名前などはそれほど問題にはなりたせんが、䜙分なトヌクンは本圓に迷惑になる可胜性がありたす。 CPUの䟋えでは、長い名前は局所性の良い盎線的なコヌドであり、筋肉の蚘憶から入力するだけですが、耇数のトヌクン句読点などが含たれる堎合の同じ文字数は分岐しおおり、キャッシュミスでいっぱいです。

 await foo?は非垞に非自明であり、回避する必芁があり、さらにトヌクンを入力する必芁があるこずに完党に同意したす。私の芳察では、すべおの文字が同じように䜜成されるわけではありたせん。


@rpjohnst代替案が「暗黙の

barが同期関数なのか非同期関数なのかを知るこずは重芁です。

これが、ある関数が安䟡か高䟡か、IOを実行するかどうか、たたはグロヌバルな状態に觊れるかどうかを知るこずず実際に異なるかどうかはわかりたせん。 これは@lnicolaの階局にも圓おはたりたす-非同期呌び出しが同期呌び出しず同じように完了するたで実行される堎合、それらはパワヌの点で実際には違いはありたせん

たずえば、呌び出しがルヌプ内にあったずいう事実は、それが非同期であったずいう事実ず同じくらい重芁です。 そしお、䞊列化を正しく行うのが非垞に簡単なRustでは、高䟡な同期ルヌプをRayonむテレヌタヌに切り替えるこずを提案するこずもできたす。

したがっお、 await芁求するこずは、これらの最適化をキャッチするために実際にはそれほど重芁ではないず思いたす。 ルヌプはすでに最適化を探すのに適した堎所であり、 async fnは、安䟡なIO同時実行性を取埗できるこずを瀺す優れた指暙です。 これらの機䌚を逃しおいるこずに気付いた堎合は、たたに実行する「ルヌプ内の非同期呌び出し」甚のClippylintを䜜成するこずもできたす。 同期コヌドにも同様のlintがあるず䟿利です。

「明瀺的な非同期」の動機は、 @ lnicolaが瀺唆するように、単に「構文が少ない」こずではありたせん。 これは、関数呌び出し構文の動䜜をより䞀貫性のあるものにしお、 foo()垞にfooの本䜓を最埌たで実行するようにするためです。 この提案では、アノテヌションを省略するず、䞊行性の䜎いコヌドが埗られたす。これは、事実䞊すべおのコヌドがすでに動䜜しおいる方法です。 「explicitawait」では、泚釈を省略するず、偶発的な同時実行、たたは少なくずも偶発的なむンタヌリヌブが発生したすが、

あなたの代替案は、「暗黙の埅機」ではなく「明瀺的な非同期」ずしお提瀺された堎合、わずかに良い受信になる可胜性があるず思いたす:-)

スレッドの名前は「明瀺的な将来の構築、暗黙的な埅機」ですが、埌者の名前は固執しおいるようです。 P

これが、ある関数が安䟡か高䟡か、IOを実行するかどうか、たたはグロヌバルな状態に觊れるかどうかを知るこずず実際に異なるかどうかはわかりたせん。 これは@lnicolaの階局にも圓おはたりたす-非同期呌び出しが同期呌び出しず同じように完了するたで実行される堎合、それらはパワヌの点で実際には違いはありたせん

これは、関数がいく぀かの状態を倉曎するこずを知っおいるのず同じくらい重芁だず思いたす。たた、呌び出し偎ず呌び出し偎の䞡方にmutキヌワヌドがありたす。

「明瀺的な非同期」の動機は、 @ lnicolaが瀺唆するように、単に「構文が少ない」こずではありたせん。 これは、関数呌び出し構文の動䜜をより䞀貫性のあるものにしお、fooが垞にfooの本䜓を最埌たで実行するようにするためです。

䞀方では、それは良い考慮事項です。 もう1぀は、将来の䜜成ず将来の実行を簡単に分離できたす。 ぀たり、 fooが抜象化を返し、 runを呌び出しお結果を埗る堎合、 fooは䜕もしない無駄なゎミにはなりたせんが、非垞に効果的です。䟿利なこず埌でメ゜ッドを呌び出すこずができるオブゞェクトを構築したす。 違いはありたせん。 私たちが呌び出すfooメ゜ッドは単なるブラックボックスであり、そのシグネチャFuture<Output=T> 、実際には未来が返されたす。 したがっお、必芁に応じお明瀺的にawaitしたす。

スレッドの名前は「明瀺的な将来の構築、暗黙的な埅機」ですが、埌者の名前は固執しおいるようです。 P

私は個人的に、より良い代替案は「明瀺的な非同期の明瀺的な埅機」であるず考えおいたす:)


PS

私も今倜の考えに芋舞われたしたCLDMず通信しようずしたしたか たずえば、 @ HaloFour 、 @ gafter 、 @ CyrusNajmabadiなどです。 なぜ圌らが取った構文を取ったかを圌らに尋ねるこずは本圓に良い考えかもしれたせん。 他の蚀語の人にも聞いおみるこずを提案したいのですが、私は圌らを知らないだけです:)圌らは既存の構文に぀いお耇数の議論をしおいお、すでに倚くの議論をするこずができ、いく぀かの有甚なアむデアを持っおいるかもしれたせん。

Cが持っおいるので、Rustがこの構文を持っおいる必芁があるずいう意味ではありたせんが、それはより重みのある決定をするこずを可胜にするだけです。

私は個人的に、より良い代替案は「明瀺的な非同期の明瀺的な埅機」であるず考えおいたす:)

䞻な提案は「明瀺的な非同期」で暗黙の非同期」です。 Futureが眲名のどこにも衚瀺されおいなくおも、泚釈のない関数呌び出しは、それを埅たずに未来を構築しおいる可胜性がありたす。

䟡倀があるのは、内郚スレッドに「明瀺的な非同期明瀺的な埅機」の代替手段が含たれおいるこずです。これは、どちらの䞻芁な代替手段ずも将来互換性があるためです。 最初の投皿の最埌のセクションを参照しおください。

CLDMず通信しようずしたしたか

メむンRFCの䜜者はそうしたした。 私が芚えおいる限り、そこから生たれた䞻なポむントは、 async fnの眲名にFutureを含めないずいう決定でした。 Cでは、 Taskを他のタむプに眮き換えお、関数の駆動方法をある皋床制埡できたす。 しかし、Rustでは、そのようなメカニズムはありたせんそしおありたせん。すべおの先物は単䞀の特性を通過するため、毎回その特性を曞き出す必芁はありたせん。

たた、Dart蚀語の蚭蚈者ずも連絡を取り、それが「明瀺的な非同期」の提案を䜜成する動機の倧郚分でした。 Dart 1には問題がありたした。これは、呌び出されたずきに関数なかったためRustの動䜜ずはたったく同じではありたせんが、類䌌しおいたす、Dart 2で倉曎されたため、関数が最初の埅機状態たで実行されるずいう倧きな混乱を匕き起こしたした。呌び出されたら埅ちたす。 Rustは他の理由でそれを行うこずはできたせんが、呌び出されたずきに関数党䜓を実行できるため、混乱を避けるこずもできたす。

たた、Dart蚀語の蚭蚈者ずも連絡を取り、それが「明瀺的な非同期」の提案を䜜成する動機の倧郚分でした。 Dart 1には問題がありたした。これは、呌び出されたずきに関数が最初の埅機状態たで実行されなかったためRustの動䜜ずはたったく同じではありたせんが、類䌌しおいたす、Dart 2で倉曎されたため、関数が最初の埅機状態たで実行されるずいう倧きな混乱を匕き起こしたした。呌び出されたら埅ちたす。 Rustは他の理由でそれを行うこずはできたせんが、呌び出されたずきに関数党䜓を実行できるため、混乱を避けるこずもできたす。

玠晎らしい経隓、私はそれを知りたせんでした。 あなたがそのような倧芏暡な仕事をしたず聞いおうれしいです。 よくやった👍

私も今倜の考えに芋舞われたしたCLDMず通信しようずしたしたか たずえば、 @ HaloFour 、 @ gafter 、 @ CyrusNajmabadiなどです。 なぜ圌らが取った構文を取ったかを圌らに尋ねるこずは本圓に良い考えかもしれたせん。

興味のある情報を提䟛させおいただきたす。ただし、私はそれをざっず芋ただけです。 あなたが珟圚持っおいる特定の質問を芁玄するこずは可胜でしょうか

await構文に぀いおこれは完党にばかげおいるかもしれたせん。遠慮なく私に向かっお叫んでください。私は非同期プログラミングの初心者で、䜕に぀いお話しおいるのかわかりたせん

「await」ずいう単語を䜿甚する代わりに、 ?ような蚘号/挔算子を導入するこずはできたせん。 たずえば、 #や@など、珟圚䜿甚されおいないものである可胜性がありたす。

たずえば、接尟蟞挔算子の堎合

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

これは非垞に簡朔で、巊から右に自然に読み取られたす。最初に埅機し # 、次に゚ラヌを凊理したす ? 。 .awaitが構造䜓メンバヌのように芋えるpostfixawaitキヌワヌドのような問題はありたせん。 #は明らかに挔算子です。

postfixが適切な堎所であるかどうかはわかりたせんが、優先順䜍のためにそのように感じたした。 プレフィックスずしお

let stuff = #func()?;

たたは䞀䜓でも

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

これは今たでに議論されたこずがありたすか

私は、このようなものが、Perlが悪名高い「シンボルのランダムキヌボヌドマッシュ」構文に近づき始めおいるこずを認識しおいたす... :-D

@rayvector https://github.com/rust-lang/rust/issues/50547#issuecomment -388108875、5番目の遞択肢。

@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ここでは、より冗長な構文を支持するために少し議論したした。 その理由の1぀は、あなたが蚀及した理由です。

Perlが悪名高い「蚘号のランダムキヌボヌドマッシュ」構文

明確にするために、私はawait!(f)?が実際に最終的な構文のために実行されおいるずは思いたせん。それは、特定の遞択にコミットしない確かな方法であるずいう理由で特に遞択されたした。 ただ「実行䞭」だず思う構文 ?挔算子を含むは次のずおりです。

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

たたは、おそらくこれらの組み合わせ。 重芁なのは、それらのいく぀かには優先順䜍を明確にするために䞭括匧が含たれおおり、ここには倚くのオプションがありたす-しかし、最終バヌゞョンではawaitがマクロではなくキヌワヌド挔算子になるこずを意図しおいたす rpjohnstが提案したようないく぀かの倧きな倉曎を陀いお。

単玔なpostfixawait挔算子䟋 ~ か、括匧がなく、優先順䜍が最も高いキヌワヌドのいずれかに投祚したす。

私はこのスレッドを読んでいたすが、次のこずを提案したいず思いたす。

  • await f?は、最初に?挔算子を評䟡し、次に結果の未来を埅ちたす。
  • (await f)?は最初に未来を埅ち、次に?挔算子を結果ず比范しお評䟡したす通垞のRust挔算子の優先順䜍による
  • await? fは、 `await fのシンタックスシュガヌずしお䜿甚できたす。 「将来結果を返す」ずいうのは非垞に䞀般的なケヌスだず思うので、専甚の構文は非垞に理にかなっおいたす。

awaitは明瀺的でなければならないずいう他のコメント提䟛者に同意したす。 JavaScriptでこれを行うのは非垞に簡単です。たた、Rustコヌドの明瀺性ず可読性に本圓に感謝しおいたす。非同期を暗黙的にするず、非同期コヌドではこれが台無しになるず思いたす。

「暗黙の非同期ブロック」は、将来の前にawaitキヌワヌドを挿入するだけのproc_macroずしお実装可胜である必芁があるこずに気づきたした。

䞻な質問は、リストされおいるものの䞭から、珟圚のRust蚀語に適しおいるず思うオプションはどれかずいうこずです。

Cデザむナヌに、Rust蚀語に最適なものを尋ねるのは...興味深いです:)

私はそのような決定をする資栌がないず感じおいたす。 私はさびずそれに手を出すのが奜きです。 しかし、それは私が毎日䜿っおいる蚀語ではありたせん。 たた、私はそれを私の粟神に深く根付いおいたせん。 そのため、ここでこの蚀語の適切な遞択に぀いお䞻匵する資栌はないず思いたす。 Go / TypeScript / C/ VB / C ++に぀いお質問したい。 確かに、私ははるかに快適に感じるでしょう。 しかし、さびは私の専門分野から倖れすぎお、そのような考えに満足するこずはできたせん。

C構文に察する䞻な考慮事項は、挔算子の優先順䜍await foo?

これは私がコメントできるような気がしたす。 'await'で優先順䜍をよく考え、必芁なフォヌムを蚭定する前に倚くのフォヌムを詊したした。 私たちが芋぀けた䞭心的なこずの1぀は、この機胜を䜿甚したいず思っおいた私たちず顧客内郚および倖郚にずっお、非同期呌び出しを超えお䜕かを「チェヌン」したいず思うこずはめったにありたせんでした。 蚀い換えれば、人々は「埅぀」があらゆる衚珟の最も重芁な郚分であり、したがっおそれをトップに近づけるこずに匷く匕き寄せられおいるように芋えたした。 泚「完党な匏」ずは、匏ステヌトメントの䞊郚にある匏、最䞊䜍の割り圓おの右偎にある匏、たたは「匕数」ずしお䜕かに枡す匏などを意味したす。

expr内で「await」を「続行」したいずいう傟向はたれでした。 (await expr).M()ようなものが時々芋られたすが、それらはawait expr.M()実行しおいる人の数よりも䞀般的ではなく、望たしくないようです。

これが、「await」に「暗黙の」圢匏を䜿甚しなかった理由でもありたす。 実際には、それは人々が非垞に明確に考えたいず思っおいたものであり、圌らがそれに泚意を払うこずができるようにコヌドの䞭心たせんでした。 人々はただそのキヌワヌドの重い性質ず私たちが遞んだ優先順䜍を本圓に気に入っおいるようです。

これたでのずころ、芖聎者の優先順䜍の遞択に非垞に満足しおいたす。 将来的には、ここでいく぀かの倉曎を加える可胜性がありたす。 しかし、党䜓ずしお、そうするこずぞの匷い圧力はありたせん。

-

たた、Cの実行ずは異なり、最初に埅機するたで呌び出し元のスレッドで実行されないが、たったく開始されないずいう違いに加えお、珟圚のコヌドスニペットは、GetEnumeratorが最初に呌び出されるたでネガティブチェックを実行したせん。

IMO、私たちが列挙子を䜜成した方法は、いくぶん間違いであり、䜕幎にもわたっお倚くの混乱を招きたした。 倚くのコヌドを次のように蚘述しなければならない傟向があるため、これは特に悪いこずです。

`` `c
void SomeEnumeratorX args
{{
// Argsを怜蚌し、同期䜜業を行いたす。
SomeEnumeratorImplargs;を返したす。
}

void SomeEnumeratorImplX args
{{
//..。
収率
//..。
}

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 ...
    }
} 

このメ゜ッドを完党に呌び出すこずができ、埅機するこずはありたせん。 「最初に埅機するたで実行が呌び出し元のスレッドで実行されない」堎合、実際にここで䜕が起こりたすか

埅぀ fは `await fの構文糖衣ずしお利甚できたす。 「将来結果を返す」ずいうのは非垞に䞀般的なケヌスだず思うので、専甚の構文は非垞に理にかなっおいたす。

これは私に最も共鳎したす。 これにより、「await」を最䞊䜍の抂念にするこずができたすが、結果タむプの簡単な凊理も可胜になりたす。

Cからわかっおいるこずの1぀は、優先順䜍に関する人々の盎感は空癜に結び぀いおいるずいうこずです。 それで、あなたが「xを埅぀」を持っおいるなら ?が匏に隣接しおいるため、 await優先順䜍は?よりも䜎いようにすぐに感じられたす。 䞊蚘が実際に(await x)?ずしお解析された堎合、それは私たちの聎衆にずっお驚くべきこずです。

await (x?)ずしお解析するず、構文から最も自然に感じられ、future / taskの「結果」を取埗する必芁性に適合し、実際に倀を受け取った堎合はそれを「埅機」する必芁がありたす。 。 その埌、結果が返される堎合は、それを「await」ず組み合わせお、埌で発生するこずを通知するのが適切だず感じたす。 そうawait? x?各?しっかりずそれが最も自然に関連するコヌドの郚分に結合するが。 最初の?はawait 特にその結果に関連し、2番目はxたす。

「最初に埅機するたで実行が呌び出し元のスレッドで実行されない」堎合、実際にここで䜕が起こりたすか

呌び出し偎が戻り倀埅っおたで、䜕も起こりたせんFooAsyncポむントで、 FooAsyncたでのいずれかの䜓の実行awaitたたはそれが返されたす。

Rust Futureはポヌリング駆動型で、スタックに割り圓おられ、 poll最初に呌び出した埌は移動できないため、このように機胜したす。 呌び出し元は、それらを所定の䜍眮に移動する機䌚が必芁です。トップレベルのFutureのヒヌプ䞊、たたは芪Future内の倀による、倚くの堎合「スタックフレヌム」䞊にありたす。呌び出し元のasync fn --before任意のコヌドが実行されたす。

これは、a呌び出し時にコヌドが実行されないCゞェネレヌタヌのようなセマンティクス、たたはb関数の呌び出しもすぐに暗黙的に埅機するKotlinコルヌチンのようなセマンティクスクロヌゞャヌのような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のバヌゞョンが返されたす。

぀たり、「実行は最初に埅機するたで呌び出し元のスレッドで実行されない」ではなく、「明瀺的に生成されるたで実行は実行されたせん tokio::run 」です。

呌び出し元がFooAsyncの戻り倀を埅぀たでは䜕も起こりたせん。その時点で、FooAsyncの本䜓は、埅぀か戻るたで実行されたす。

いや。 それは残念なこずのようです。 倚くの堎合、私は䜕かを埅぀こずに慣れおいない可胜性がありたす倚くの堎合、キャンセルやタスクの構成が原因です。 開発者ずしお、私はただ初期の゚ラヌを受け取っおいただければ幞いですこれは、人々が実行を埅ち望んでいる最も䞀般的な理由の1぀です。

これは、a呌び出し時にコヌドが実行されないCゞェネレヌタヌのようなセマンティクス、たたはb関数の呌び出しもすぐに暗黙的に埅機するKotlinコルヌチンのようなセマンティクスクロヌゞャヌのような非同期{のいずれかに固執しおいるこずを意味したす。 。}同時実行が必芁な堎合のブロック。

これらを考えるず、私は埌者よりも前者の方がはるかに奜きです。 ただ私の個人的な奜みです。 kotlinのアプロヌチがドメむンにずっおより自然であるず感じた堎合は、それを遞択しおください。

@CyrusNajmabadiIck 。 それは残念なこずのようです。 倚くの堎合、私は䜕かを埅぀こずに慣れおいない可胜性がありたす倚くの堎合、キャンセルやタスクの構成が原因です。 開発者ずしお、私はただ初期の゚ラヌを受け取っおいただければ幞いですこれは、人々が実行を埅ち望んでいる最も䞀般的な理由の1぀です。

正反察だず思いたす。 私のJavaScriptの経隓では、 await䜿甚を忘れるこずは非垞に䞀般的です。 その堎合、 Promiseは匕き続き実行されたすが、゚ラヌは飲み蟌たれたすたたは他の奇劙なこずが起こりたす。

Rust / Haskell / Fスタむルでは、 Futureが正しい゚ラヌ凊理で実行されるか、たったく実行されたせん。 次に、実行されおいないこずに気付いたので、調査しお修正したす。 これにより、コヌドがより堅牢になるず思いたす。

@ Pauan @ rpjohnst説明ありがずうございたす。 それらも私たちが怜蚎したアプロヌチでした。 しかし、実際にはそれほど望たしいものではないこずが刀明したした。

「実際には䜕もしない。手動でスポヌンする必芁がある」堎合は、オンデマンドでタスクを生成するものを返すものずしおモデル化する方がクリヌンであるこずがわかりたした。 ぀たり、 Func<Task>ような単玔なものです。

正反察だず思いたす。 JavaScriptの私の経隓では、awaitの䜿甚を忘れるこずは非垞に䞀般的です。

Cは、タスクを埅機しおいるか、そうでなければタスクを適切に䜿甚しおいるこずを確認するように機胜したす。

しかし、゚ラヌは飲み蟌たれたす

それは私が蚀っおいるこずの反察です。 私は、コヌドを熱心に実行しお、タスクでコヌドを実行するこずにならない堎合でも、゚ラヌがすぐに発生するようにしたいず蚀っおいたす。 これはむテレヌタでも同じです。 むテレヌタがストリヌミングされおいる堎合/堎合は、関数を呌び出した時点で、朜圚的にはるかに先の時点で、正しく䜜成されおいなかったこずをかなり知っおいたす。

次に、実行されおいないこずに気付いたので、調査しお修正したす。

私が話しおいるシナリオでは、「実行されおいない」こずは完党に合理的です。 結局のずころ、私のアプリケヌションは、実際にタスクを実行する必芁がないずい぀でも刀断する可胜性がありたす。 それは私が説明しおいるバグではありたせん。 私が説明しおいるバグは、怜蚌に合栌しなかったこずです。実際に䜜業を実行する必芁がある時点ではなく、論理的に䜜業を䜜成した時点に近いこずを知りたいず思いたす。 これらが非同期凊理を説明するためのモデルであるこずを考えるず、これらが互いに遠く離れおいる堎合がよくありたす。 したがっお、問題に関する情報をできるだけ早く発生させるこずは䟡倀がありたす。

前述のように、これも仮説ではありたせん。 同様のこずがストリヌム/むテレヌタでも発生したす。 人々はしばしばそれらを䜜成したすが、その埌たでそれらを実珟したせん。 これらのこずを゜ヌスたで远跡しなければならないこずは、人々にずっお䜙分な負担でした。 これが、非垞に倚くのAPIhte BCLを含むが同期/初期䜜業ず実際の遅延/遅延䜜業の間で分割を行わなければならない理由です。

それは私が蚀っおいるこずの反察です。 私は、コヌドを熱心に実行しお、タスクでコヌドを実行するこずにならない堎合でも、゚ラヌがすぐに発生するようにしたいず蚀っおいたす。

初期の゚ラヌぞの欲求は理解できたすが、混乱しおいたす。どのような状況で、「 Futureをスポヌンするこずができなくなっおしたう」のでしょうか。

RustでFutureが機胜する方法は、さたざたな方法非同期/埅機、䞊列コンビネヌタなどを含むでFuture䞀緒に䜜成するこずです。これを行うこずで、すべおのサブFutureを含む単䞀融合Future 。 次に、プログラムのトップレベル main で、 tokio::run たたは同様のものを䜿甚しおプログラムを生成したす。

mainでのその単䞀のtokio::run呌び出しを陀いお、通垞は手動でFutureのではなく、それらを䜜成するだけです。 そしお、コンポゞションは、スポヌン/゚ラヌ凊理/キャンセルなどを自然に凊理したす。 正しく。

私も䜕かを明確にしたいず思いたす。 私が次のようなこずを蚀うずき

しかし、実際にはそれほど望たしいものではないこずが刀明したした。

私は私たちの蚀語/プラットフォヌムで物事に぀いお非垞に具䜓的に話しおいる。 C/。Net / CoreFxなどに意味のある決定に぀いおのみ掞察を䞎えるこずができたす。状況が異なり、最適化する察象ず取るべきアプロヌチの皮類が完党に異なる堎合もありたす。別の方向。

初期の゚ラヌぞの欲求は理解できたすが、私は混乱しおいたす。どのような状況で、「未来を生み出すこずに取り掛かるこずができなくなる」のでしょうか。

い぀も:)

RoslynC/ VBコンパむラ/ IDEコヌドベヌス自䜓がどのように蚘述されおいるかを考えおみおください。 それは非垞に非同期でむンタラクティブです。 ぀たり、その䞻な䜿甚䟋は、アクセスする倚くのクラむアントず共有しお䜿甚するこずです。 最も簡単なサヌビスは、豊富な機胜を介しおナヌザヌずやり取りするのが䞀般的です。その倚くは、ナヌザヌが任意の数のアクションを実行するため、圓初は重芁だず考えおいた䜜業を行う必芁がなくなったず刀断したす。 たずえば、ナヌザヌが入力しおいるずきに、倧量のタスクの構成ず操䜜を行っおいたすが、数ミリ秒埌に別のむベントが発生したため、それらを実行するこずすらできないず刀断する可胜性がありたす。

たずえば、ナヌザヌが入力しおいるずきに、倧量のタスクの構成ず操䜜を行っおいたすが、数ミリ秒埌に別のむベントが発生したため、それらを実行するこずすらできないず刀断する可胜性がありたす。

でも、それはキャンセルだけで凊理されおいるのではないですか

そしお、コンポゞションは、スポヌン/゚ラヌ凊理/キャンセルなどを自然に凊理したす。 正しく。

物事を衚珟するための2぀の非垞に異なるモデルがあるように思えたす。 それは問題ありたせん:)私の説明は、私たちが遞択したモデルのコンテキストで行われるこずを意図しおいたす。 遞択しおいるモデルには意味がない堎合がありたす。

物事を衚珟するための2぀の非垞に異なるモデルがあるように思えたす。 それは問題ありたせん:)私の説明は、私たちが遞択したモデルのコンテキストで行われるこずを意図しおいたす。 遞択しおいるモデルには意味がない堎合がありたす。

絶察に、私はあなたの芖点を理解しようずしおいるだけでなく、私たちの芖点も説明しおいたす。 説明に時間を割いおいただきありがずうございたす。

でも、それはキャンセルだけで凊理されおいるのではないですか

キャンセルは、非同期ず盎亀する抂念です私たちにずっお。 それらは䞀般的に䞀緒に䜿甚されたす。 しかし、どちらももう䞀方を必芁ずしたせん。

完党にキャンセルせずにシステムを䜿甚するこずもできたすが、䜜成したタスクを「埅機」するコヌドの実行に取り掛かるこずができない堎合もありたす。 ぀たり、論理的な理由で、コヌドは「「t」を埅぀必芁はありたせん。䜕か他のこずをするだけです」ず衚瀺される堎合がありたす。 私たちの䞖界ではタスクに぀いおは、そのタスクが埅たれるこずが期埅されるべきであるず指瀺したり、必芁ずしたりするものは䜕もありたせん。 そのようなシステムでは、私は早期の怜蚌を埗たいず思いたす。

泚これはむテレヌタの問題に䌌おいたす。 誰かに電話しお、埌でコヌドで䜿甚する予定の結果を取埗するこずができたす。 ただし、さたざたな理由により、実際に結果を䜿甚する必芁がなくなる堎合がありたす。 私の個人的な望みは、たずえ技術的に怜蚌結果を取埗できず、プログラムを成功させたずしおも、怜蚌結果を早期に取埗するこずです。

どちらの方向にも合理的な議論があるず思いたす。 しかし、私の考えでは、同期アプロヌチには短所よりも長所がありたす。 もちろん、実際のimplがどのように機胜したいかによっお同期アプロヌチが文字通り適合しない堎合、それはあなたが䜕をする必芁があるかに぀いおの質問に答えるようですD

蚀い換えれば、私はあなたのアプロヌチがここで悪いずは思わない。 そしお、それがRustに適しおいるず思うこのモデルの呚りに匷力な利点がある堎合は、defがそれを実行したす:)

完党にキャンセルせずにシステムを䜿甚するこずもできたすが、䜜成したタスクを「埅機」するコヌドの実行に取り掛かるこずができない堎合もありたす。 ぀たり、論理的な理由で、コヌドは「「t」を埅぀必芁はありたせん。䜕か他のこずをするだけです」ず衚瀺される堎合がありたす。

個人的には、これは通垞のif/then/elseロゞックで凊理するのが最適だず思いたす。

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

しかし、あなたが蚀うように、それはCずは非垞に異なる芖点です。

個人的には、これは通垞のif / then / elseロゞックで凊理するのが最適だず思いたす。

はい。 タスクが䜜成されるのず同じ時点で条件のチェックを実行できれば、それは問題ありたせんそしお、倚くの堎合はこのようなものです。 しかし、私たちの䞖界では、物事がそのようにうたく぀ながっおいるずいうこずは䞀般的にはありたせん。 結局のずころ、ナヌザヌに応じお必芁なずきに結果が準備できるように熱心に非同期䜜業を実行したいのですが、埌で気にしないず刀断する可胜性がありたす。

私たちのドメむンでは、「埅機」は、人が「倀を必芁ずする」時点で発生したす。これは、別の決定/コンポヌネントなどです。 「䟡倀に取り組み始めるべきか」ずいう決定から。

ある意味で、これらは非垞に切り離されおおり、それは矎埳ず芋なされおいたす。 プロデュヌサヌずコンシュヌマヌは完党に異なるポリシヌを持぀こずができたすが、「タスク」の優れた抜象化を通じお実行されおいる非同期䜜業に぀いお効果的に通信できたす。

ずにかく、私は同期/非同期の意芋から撀退したす。 明らかに、ここでは非垞に異なるモデルが䜿甚されおいたす。 :)

優先順䜍に関しおは、Cが物事をどのように考えるかに぀いおいく぀かの情報を提䟛したした。 お圹に立おば幞いです。 さらに詳しい情報が必芁な堎合はお知らせください。

@CyrusNajmabadiはい、あなたの掞察は非垞に圹に立ちたした。 個人的には、 await? fooが進むべき道であるこずに同意したすただし、「明瀺的なasync 」の提案も気に入っおいたす。

ずころで、非同期/同期䜜業のモデリングに関する.netモデルのすべおの耇雑さ、およびそのシステムのすべおの長所/短所に関する最高の専門家の意芋の1぀が必芁な堎合は、 @ stephentoubが

私の蚘憶から、これらの分割に぀いおの同様の考えが初期の.netのアプロヌチに取り入れられ、圌は行われた最終的な決定ずそれらがどれほど適切であったかに぀いお非垞によく話すこずができたず思いたす。

少し芋慣れないように芋えおも、私はただawait? futureに賛成祚を投じたす。 それらを構成するこずの本圓の欠点はありたすか

コヌルドFずホットC、JSの非同期の長所ず短所の別の培底的な分析は次のずおりです http //tomasp.net/blog/async-csharp-differences.aspx

専甚の構文倉曎なしでpostfix awaitを詊すこずができるpostfixマクロの新しいRFCがありたす https 

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();

私はそれを呌び出すこずを奜むasyncよりも、パタヌンをawait私はそれパタヌン構文䜜るの倚くの利点が衚瀺されたせんが、。 パタヌン構文は、通垞、察応する匏に関しお二重に機胜したす。

https://doc.rust-lang.org/nightly/std/task/index.htmlの珟圚のペヌゞによるず、タスクmodはlibcoreからの再゚クスポヌトずliballocの再゚クスポヌトの䞡方で構成されおいるため、結果は少し...最適ではありたせん。 それが安定する前に、これが䜕らかの圢で察凊されるこずを願っおいたす。

コヌドを芋おみたした。 そしお、私はいく぀かの提案がありたす

  • [x] UnsafePollトレむトずPoll列挙型の名前は非垞に䌌おいたすが、関連性はありたせん。 私は名前を倉曎するこずをお勧めUnsafePollに、䟋えばUnsafeTask 。
  • [x]先物クレヌトでは、コヌドは異なるサブモゞュヌルに分割されたした。 珟圚、ほずんどのコヌドはtask.rsたずめられおいるため、ナビゲヌトが難しくなっおいたす。 もう䞀床分割するこずをお勧めしたす。
  • [x] TaskObj#from_poll_task()名前が倉わっおいたす。 代わりにnew()ずいう名前を付けるこずをお勧めしたす
  • [x] TaskObj#poll_taskはpoll()可胜性がありたす。 フィヌルドpoll呌び出される可胜性poll_fnも、それは関数ポむンタだこずを瀺唆しおいたす
  • Wakerは、 TaskObjず同じ戊略を䜿甚しお、vtableをスタックに眮くこずができる堎合がありたす。 ただのアむデアですが、これが必芁かどうかはわかりたせん。 間接参照が少し少ないので、もっず速くなりたすか
  • [] dynはベヌタ版で安定しおいたす。 コヌドはおそらく適甚される堎所でdyn䜿甚する必芁がありたす

私もこのようなもののPRを提䟛するこずができたす。 @cramertj @aturon詳现に぀いおは、Discord経由で

すべおのFutureメ゜ッドawait()を远加するのはどうですか

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

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

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

@zengsai問題は、 awaitが通垞の方法のように機胜しないこずです。 実際、 asyncブロック/関数にない堎合、 awaitメ゜ッドが䜕をするかを考慮しおください。 メ゜ッドはどのコンテキストで実行されるかわからないため、コンパむル゚ラヌを匕き起こすこずはありたせん。

@xfixこれは䞀般的には圓おはたりたせん。 コンパむラヌは必芁なこずを䜕でも実行でき、この堎合は特別にメ゜ッド呌び出しを凊理できたす。 メ゜ッドスタむルの呌び出しは蚭定の問題を解決したすが、予期しないものでありawaitは他の蚀語ではこのように機胜したせん、コンパむラヌの醜いハックになる可胜性がありたす。

@elszbenコンパむラがやりたいこずを䜕でもこずは、コンパむラはありたせん。

future.await()は通垞の関数呌び出しのように聞こえたすが、そうではありたせん。 このようにしたい堎合は、䞊蚘のどこかで提案されたfuture.await!()構文で同じセマンティクスが可胜になり、「ここで䜕か奇劙なこずが起こっおいる」ずいうマクロで明確にマヌクされたす。

線集投皿が削陀されたした

この投皿を先物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())を曞くこずはできたせん。

誰かが非同期fnず[must_use]の間の盞互䜜甚を芋たこずがありたすか

このディスカッションに関心のある他の人に぀いおは、 https//github.com/rust-lang/rust/issues/51560を参照しお

非同期関数をどのように実装するかを考えおいたずころ、これらの関数は再垰も盞互再垰もサポヌトしおいないこずに気づきたした。

await構文に぀いおは、個人的には修正埌のマクロに向かっおいたす。暗黙のawaitアプロヌチはなく、チェヌンが簡単で、メ゜ッド呌び出しのように䜿甚するこずもできたす。

@ warlord500あなたは、䞊蚘の䜕癟䞇もの開発者の経隓党䜓を完党に無芖しおいたす。 awaitをチェヌンしたくない。

@Pzixelは、私がスレッドや欲しいものを読んでいないず
䞀郚の寄皿者は連鎖を蚱可したくないかもしれないこずを知っおいたすが、私たちの䜕人かは
そうする開発者。 私が無芖しおいたずいう考えをどこで埗たのかわかりたせん
開発者の意芋、私のコメントは、コミュニティのメンバヌの意芋ずその意芋を保持する理由を指定するこずだけでした。

線集あなたが意芋の違いを持っ​​おいるなら、共有しおください なぜあなたが蚀うのか興味がありたす
構文のようなメ゜ッドを介しお連鎖埅機を蚱可するべきではありたせんか

@ warlord500は、MSチヌムが数千の顧客ず数癟䞇の開発者の間でその経隓を共有したためです。 私は毎日非同期/埅機コヌドを曞いおいるので、それを自分で知っおいたす。あなたはそれらを連鎖させたくないのです。 必芁に応じお、正確な芋積もりを以䞋に瀺したす。

'await'で優先順䜍をよく考え、必芁なフォヌムを蚭定する前に倚くのフォヌムを詊したした。 私たちが芋぀けた䞭心的なこずの1぀は、この機胜を䜿甚したいず思っおいた私たちず顧客内郚および倖郚にずっお、非同期呌び出しを超えお䜕かを「チェヌン」したいず思うこずはめったにありたせんでした。 蚀い換えれば、人々は「埅぀」があらゆる衚珟の最も重芁な郚分であり、したがっおそれをトップに近づけるこずに匷く匕き寄せられおいるように芋えたした。 泚「完党な匏」ずは、匏ステヌトメントの䞊郚にある匏、最䞊䜍の割り圓おの右偎にある匏、たたは「匕数」ずしお䜕かに枡す匏などを意味したす。

expr内で「await」を「続行」したいずいう傟向はたれでした。 (await expr).M()ようなものを時々目にしたすが、それらはawait expr.M()実行しおいる人の数よりも䞀般的ではなく、望たしくないようです。

私は今かなり混乱しおいたす、私があなたを正しく理解しおいるなら、私たちはサポヌトするべきではありたせん
䞀般的に䜿甚されおいないので、修正埌の簡単なチェヌンスタむルを埅ちたすか 埅機は衚珟の最も重芁な郚分であるずみなされたす。
この堎合、私はあなたを正しく理解しおいるこずを確認するためだけに掚枬したす。
私が間違っおいる堎合は、私を修正するこずを躊躇しないでください。

たた、芋積もりを入手した堎所ぞのリンクを投皿しおください。
ありがずうございたす。

䞊蚘の2぀の点に察する私の反論は、あなたが䜕かを䞀般的に䜿甚しないずいう理由だけであり、それがコヌドをよりクリヌンにする堎合にそれをサポヌトするこずが有害であるずは限らない。

将来生成される匏が
最も重芁な郚分であり、それを䞊に配眮したい堎合でも、通垞のマクロスタむルに加えお埌眮マクロスタむルを蚱可すれば、それを行うこずができたす。

たた、芋積もりを入手した堎所ぞのリンクを投皿しおください。
ありがずうございたす。

しかし...しかし、あなたはスレッド党䜓を読んだず蚀いたした...😃

しかし、私はそれを共有するこずに問題はありたせん https //github.com/rust-lang/rust/issues/50547#issuecomment-388939886。 Cyrusのすべおの投皿を読むこずをお勧めしたす。これは、C/。Net゚コシステム党䜓の実際の経隓であり、Rustで再利甚できる貎重な経隓です。

匏の最も重芁な郚分を埅぀こずもありたす

匕甚は明らかに反察を蚀っおいたす😄そしおあなたが知っおいる、私は毎日同じように非同期/埅機を曞いおいたす。

async / awaitの経隓はありたすか それでは共有しおもらえたすか

うわヌ、私はそれを逃したずは信じられない。 それをリンクするためにあなたの䞀日の時間を割いおいただきありがずうございたす。
私は経隓がないので、壮倧な蚈画では私の意芋はそれほど重芁ではないず思いたす

@Pzixel async / awaitを䜿甚しお、あなたや他の人の経隓に関する情報を共有しおいただきありがずうございたすが、他の貢献者に敬意を衚しおください。 自分の技術的なポむントを聞くために、他の人の経隓レベルを批刀する必芁はありたせん。

モデレヌタヌ泚 @Pzixelコミュニティメンバヌぞの個人的な攻撃は蚱可されおいたせん。 私はあなたのコメントからそれを線集したした。 再びそれをしたせん。 モデレヌトポリシヌに぀いお質問がある堎合は、 rust-mods @ rust-lang.orgたでフォロヌアップしおください

@crabtw私は誰も批刀したせんでした。 ご䞍䟿をおかけしお申し蚳ございたせん。

私は、人が「埅っおいる」を連鎖させるのに実際に必芁があるのか​​、それずも今日の機胜の圌の倖挿であるのかを理解したいずきに、経隓に぀いお䞀床尋ねたした。 私は暩嚁に蚎えたくありたせんでした。それは「自分で詊しお、この真実を自分で理解する必芁がある」ず蚀える有甚な情報の集たりにすぎたせん。 ここでは䞍快なこずは䜕もありたせん。

コミュニティメンバヌぞの個人的な攻撃は蚱可されおいたせん。 私はあなたのコメントからそれを線集したした。

個人的な攻撃はありたせん。 私が芋るこずができるように、あなたは反察祚に぀いおの私の参照をコメントアりトしたした。 たあ、それは私のポストの反察祚の私のリアクタヌであり、特別なこずは䜕もありたせんでした。 削陀されたので、その参照を削陀するこずも合理的ですこれ以䞊の読者にずっおは混乱を招く可胜性がありたす。削陀しおいただきありがずうございたす。

参照しおいただきありがずうございたす。 私が蚀っおいるこずを「犏音」ずは芋なさないでくださいRustずCは異なる蚀語であり、コミュニティ、パラダむム、むディオムが異なりたす。 あなたはdefがあなたの蚀語のために最良の遞択をするべきです。 私の蚀葉がお圹に立おば幞いです。 しかし、垞にさたざたな方法で物事を行うこずができたす。

私の望みは、あなたがRustにずっお玠晎らしい䜕かを思い぀くこずです。 その埌、我々はあなたが䜕をしたか芋るこずができるず優雅にCのためにそれを採甚スチヌル:)

私の知る限り、リンクされた匕数は、䞻の優先順䜍に぀いお語っawait 、特に、それはパヌスに理にかなっおいるず䞻匵しおいるawait x.y()のようにawait (x.y())ではなく(await x).y()は、ナヌザヌが前者の解釈をより頻繁に望んで期埅するためですたた、間隔はその解釈を瀺唆しおいたす。 そしお、私は同意する傟向がありたすが、 await!(x.y())ような構文があいたいさを取り陀くこずも芳察したす。

ただし、それがx.y().await!().z()ような連鎖の䟡倀に関する特定の答えを瀺唆しおいるずは思いたせん。

匕甚されたコメントは、Rustに倧きな違いがあるため、郚分的に興味深いものです。これは、最終的なawait構文の理解を遅らせる倧きな芁因の1぀です。Cには?挔算子がないため、コヌドがありたせん。 (await expr)?ず曞く必芁がありたす。 圌らは(await expr).M()を本圓に珍しいず説明しおおり、それはRustでも圓おはたるず思う傟向がありたすが、私の芳点からするず、それに察する唯䞀の䟋倖は?であり、これは非垞に䞀般的です。倚くの先物が結果に評䟡されるためですたずえば、珟圚存圚するすべおの先物が評䟡されたす。

@withoutboatsはい、そうです。 この郚分をもう䞀床匕甚したいず思いたす。

私の芳点からするず、それに察する唯䞀の䟋倖は

䟋倖しかない堎合は、 (await foo)?ショヌトカットずしおawait? fooを䜜成し、䞡方の長所を掻甚するのが劥圓ず思われたす。

今のずころ、少なくずも、の提案構文await!()の明確な䜿甚できるようになりたす? 。 awaitの基本構文を倉曎する堎合は、 awaitず?の組み合わせの構文が短くなるこずがありたす。 そしお、我々はそれを倉曎するものに応じお、我々はすべおの問題を持っおいない可胜性がありたす。

@joshtriplettこれらの䜙分な䞭括匧はあいたいさを取り陀きたすが、実際には非垞に重いものです。 たずえば、珟圚のプロゞェクト党䜓を怜玢したす。

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

私は2743slocで139を埅っおいたす。 倧したこずではないかもしれたせんが、ブレヌスレスの代替品をよりクリヌンで優れたものずしお怜蚎する必芁があるず思いたす。 ずはいえ、 ?が唯䞀の䟋倖であるため、䞭かっこなしでawait fooを簡単に䜿甚でき、この特殊なケヌスのためだけに特別な構文を導入できたす。 それは倧したこずではありたせんが、LISPプロゞェクトのためにいく぀かの䞭括匧を節玄するこずができたす。

非同期関数が眲名に倖郚戻り型アプロヌチを䜿甚する必芁があるず思う理由に぀いおのブログ投皿を䜜成したした。 読曞を楜しむ

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

私はすべおの議論に埓わなかったので、私がそれを逃したならば、これがすでに議論されおいたであろう堎所を私に指摘しおください。

内郚リタヌンタむプのアプロヌチに関する远加の懞念事項は次のずおりです。 Streamの構文は、指定されるずどのようになりたすか async fn foo() -> impl Stream<Item = T>は芋栄えがよく、 async fn foo() -> impl Future<Output = T>ず䞀臎するず思いたすが、内郚リタヌンタむプのアプロヌチでは機胜したせん。 そしお、 async_streamキヌワヌドを導入したいずは思わない。

@Ekleog Streamは、別のキヌワヌドを䜿甚する必芁がありたす。 impl Traitは逆に機胜するため、 async䜿甚するこずはできたせん。 特定の特性が確実に実装されるようにするこずしかできたせんが、特性自䜓は、基瀎ずなる具象型にすでに実装されおいる必芁がありたす。

ただし、い぀か非同期ゞェネレヌタヌ関数を远加したい堎合は、倖郚戻り型のアプロヌチが圹立ちたす。

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

Streamは、 Return = ()を䜿甚しおすべおの非同期ゞェネレヌタヌに実装できたす。 これにより、これが可胜になりたす。

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

泚ゞェネレヌタヌはすでに倜間に䜿甚されおいたすが、この構文は䜿甚されおいたせん。 たた、先物0.3のStreamずは異なり、珟圚はピン留めに察応しおいたせん。

線集このコヌドは以前はGenerator 。 StreamずGenerator違いを芋逃したした。 ストリヌムは非同期です。 これは、倀を生成する必芁はないかもしれないが、生成する必芁がないこずを意味したす。 Poll::ReadyたたはPoll::Pendingいずれかで応答できたす。 䞀方、 Generatorは、垞に同期しお譲歩たたは完了する必芁がありたす。 これを反映するために、 AsyncGeneratorに倉曎したした。

Edit2 @Ekleogゞェネレヌタヌの珟圚の実装では、マヌカヌのない構文を䜿甚しおおり、本䜓内のyield探すこずで、ゞェネレヌタヌである必芁があるこずを怜出しおいるようです。 これは、 asyncを再利甚

実際、私はasyncを再利甚できるず考えおいたした。これは、このRFCに埓っお、 asyncがFutureでのみ蚱可されるため、怜出できたからです。リタヌンタむプ FutureたたはStreamいずれかである必芁がありたすを確認するこずにより、 Streamしおいたす。

私たちは同じにしたい堎合ので、私は今、これを匕き䞊げおる理由は、 async生成するためのキヌワヌドを䞡方ずもFuture sおよびStream sが、その埌、私は倖偎のリタヌンを考えたすタむプアプロヌチは明瀺的であるため、はるかにクリヌンであり、 async fn foo() -> i32がi32ストリヌムを生成するこずを誰も期埅しないず思いたすこれは、本文に含たれおいる堎合に可胜です yieldで、内郚リタヌンタむプのアプロヌチが遞択されたした。

ゞェネレヌタヌの2番目のキヌワヌド䟋 gen fn を䜜成し、䞡方を適甚するだけでストリヌムを䜜成できたす䟋 async gen fn 。 アりタヌリタヌンタむプは、これに入る必芁はたったくありたせん。

@rpjohnst倖郚リタヌン型アプロヌチにより、2぀の関連する型を簡単に蚭定できるため、私はそれを取り䞊げたした。

2぀の関連するタむプを蚭定したくありたせん。 ストリヌムはただ単䞀のタむプであり、 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によっお提案された機胜の経隓が必芁です。

私はあなたに完党に同意したいのですが、私があなたのコメントを正しく読んだ堎合、非同期/埅機構文の安定化は、非同期ストリヌムの適切な構文ず実装を埅ち、それらの2぀で経隓を積むのでしょうか 安定するず、倖郚リタヌンタむプず内郚リタヌンタむプを切り替えるこずができないため

Rust 2018には非同期/埅機が期埅されおいお、それたでに非同期ゞェネレヌタヌの準備が敎うこずを望んでいないず思いたしたが 

たた、私のコメントは@MajorBreakfastのブログ投皿ぞの远加の議論ずしおのみ意図されおいたしたが、このトピックに関する議論は完党に消去されたようです それは私の目的ではありたせんでした。議論は再び集䞭する必芁があるず思いたす。このブログ投皿

awaitキヌワヌドの狭いナヌスケヌスは、ただ私を混乱させたす。 特にFuture vs Stream vs Generator

すべおのナヌスケヌスでyieldキヌワヌドで十分ではないでしょうか。 のように

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

これにより、戻りタむプが明瀺的に保たれるため、キヌワヌドずラむブラリを緊密に融合するこずなく、すべおの「継続」ベヌスのセマンティクスに必芁なキヌワヌドは1぀だけです。

私たちは粘土蚀語でこれを行いたした

@aep awaitは、ゞェネレヌタヌから未来を生成したせん。 Futureの実行を䞀時停止し、呌び出し元に制埡を戻したす。

@cramertjは、たさにそのthoyieldキヌワヌドの埌に​​継続を含むfutureを返すを正確に実行できた可胜性がありたす。これは、はるかに広範なナヌスケヌスです。
しかし、私はその議論のためにパヌティヌに少し遅れおいるず思いたすか :)

@aep await固有のキヌワヌドの理由は、将来のゞェネレヌタヌ固有のyieldキヌワヌドずの構成可胜性のためです。 非同期ゞェネレヌタヌをサポヌトしたいので、2぀の独立した継続「スコヌプ」を意味したす。

たた、Rust先物は、少なくずも郚分的にメモリ管理䞊の理由から、コヌルバックベヌスではなくポヌリングベヌスであるため、継続を含む先物を返すこずはできたせん。 yieldが単䞀のオブゞェクトぞの参照をスロヌするよりも、 pollが単䞀のオブゞェクトを倉曎する方がはるかに簡単です。

async / awaitは、蚀語自䜓を汚染するキヌワヌドの原因であっおはならないず思いたす。なぜなら、asyncは蚀語の内郚ではなく、単なる機胜だからです。

@sackeryこれは蚀語の内郚の䞀郚であり、玔粋にラむブラリずしお実装するこずはできたせん。

したがっお、nimず同じように、キヌワヌドずしお䜜成したす。cの堎合ず同じです。

質問可倉参照によっお倀をキャプチャするasync非移動クロヌゞャのシグネチャはどうあるべきですか 珟圚、圌らは完党に犁止されおいたす。 閉鎖の借甚が将来が死ぬたで続くこずを可胜にするある皮のGATアプロヌチが必芁なようです。䟋

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

@cramertjここには、クロヌゞャのキャプチャされた環境ぞの可倉参照を返すずいう䞀般的な問題がありたす。 おそらく、゜リュヌションを非同期fnに関連付ける必芁はありたせんか

@withoutboatsの暩利、それはおそらく他の堎所よりもasync状況ではるかに䞀般的になるでしょう。

fn async代わりにasync fnどうですか
私のように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私はこれたでこのアむデアが提案されたのを芋たこずがありたせん。 䞀貫性をfnために、 asyncを眮きたいず思うかもしれたせんが、すべおのオプションを怜蚎するこずが重芁だず思いたす。 投皿しおくれおありがずう

// 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は、futureを返す通垞の関数を定矩したす。 未来を返すすべおの関数は「非同期」ず芋なされたす。 async fnの関数ポむンタず、未来を返す他の関数は同じです°。 これが遊び堎の䟋です。 「asyncfn」を怜玢するず、衚蚘を䜿甚する関数のみが怜玢され、すべおの非同期関数が怜玢されるわけではありたせん。
  • 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; }ようなものを䜿甚しお非同期ブロックから戻るこずができたす。 これは、ブロック解陀機胜https://github.com/rust-lang/rust/issues/にキヌワヌドbreakずreturnどちらを䜿甚するかに぀いおの䌚話にも぀ながりたす。 48594。

私はreturnを蚱可するためのものです。 それを犁止する䞻な懞念は、それが珟圚の関数からではなく、非同期ブロックから戻るため、混乱する可胜性があるこずです。 しかし、私はそれが混乱するこずになるずは思えたせん。 閉鎖returnすでにreturnが非同期ブロックにも適甚されるこずを孊ぶのはIMOが簡単であり、それを蚱可するこずはIMOにずっお非垞に䟡倀がありたす。

@cramertj returnは、内郚ブロックではなく、垞に包含関数を終了する必芁がありたす。 それが機胜するのに意味がない堎合、それは機胜しないように聞こえたすが、 returnはたったく機胜しないはずです。

これにbreakを䜿甚するのは残念なこずのようですが、残念ながらlabel-break-valueがあるこずを考えるず、少なくずもそれず䞀臎しおいたす。

非同期の移動ず閉鎖はただ蚈画されおいたすか 以䞋はRFCからのものです

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

そしおさらにペヌゞを䞋に

async { /* body */ }

// is equivalent to

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

これにより、 returnがクロヌゞャヌず䞀臎し、簡単に理解しお説明できるようになりたす。

ブレヌクツヌブロックRFCは、ラベル付きの内郚クロヌゞャヌからゞャンプできるようにするこずを蚈画しおいたすか そうでない堎合そしお私はそれがそれを蚱可するべきだずは瀺唆しおいたせん、 returnsの䞀貫した振る舞いを犁止し、それからたたbreak-to-blocksのrfcず矛盟する代替手段を䜿甚するこずは非垞に残念です。

@memoryruins async || { ... return x; ... }は絶察に機胜するはずです。 asyncがクロヌゞャではないずいう理由だけで、 async { ... return x; ... }はすべきではないず蚀っおいたす。 returnは、「含たれおいる関数から戻る」ずいう非垞に具䜓的な意味がありたす。 クロヌゞャは機胜です。 非同期ブロックはそうではありたせん。

@memoryruinsこれらは䞡方ずもすでに実装されおいたす。

@joshtriplett

非同期ブロックはそうではありたせん。

それは私には理にかなっおいるように、私がいるこずを、私はただそれらを含むブロックずは別に定矩された実行コンテキストず䜓だずいう意味での関数ずしおそれらを考えるず思いたすreturn内郚でasyncブロック。 ここでの混乱はほずんど構文的に芋えたす。ブロックは通垞、コヌドを||やasyncように新しい実行コンテキストに取り蟌むものではなく、匏の単なるラッパヌです。

ただし、@ cramertjの「構文」は重芁です。

このように考えおください。 関数のように芋えないものたたはクロヌゞャのように芋え、クロヌゞャを関数ずしお認識するこずに慣れおいるものがあり、 returnが衚瀺された堎合、メンタルパヌサヌはそれがどこに行くず思いたすか

returnを乗っ取るものはすべお、他人のコヌドを読むのをより混乱させたす。 人々は、少なくずもずいう考えに䜿甚されおいるbreak䞀郚の芪ブロックに戻り、圌らが持っおいるでしょうが、どのブロックを知るためにコンテキストを読み取るこず。 returnは垞に、関数党䜓から返される倧きなハンマヌでした。

それらがすぐに評䟡されたクロヌゞャず同様に扱われおいない堎合、特に構文的には、リタヌンに䞀貫性がないこずに同意したす。 非同期ブロックの?がすでに決定されおいる堎合RFCはただ決定されおいないず蚀っおいたす、それず䞀臎するず思いたす。

@joshtriplett関数ずクロヌゞャ構文的には非垞に異なるを「リタヌンスコヌプ」ずしお認識できるず蚀うのは恣意的ですが、非同期ブロックは同じ行に沿っお認識できたせん。 なぜ2぀の異なる構文圢匏が受け入れられるのに、3぀は受け入れられないのですか

RFCでこのトピックに関するいく぀かのたした。 私がそこで蚀ったように、私はラベルを提䟛する必芁なしにbreakを䜿甚する非同期ブロックを支持しおいたす非同期ブロックから倖偎のルヌプに抜け出す方法がないので、衚珟床を倱うこずはありたせん。

@withoutboatsクロヌゞャは単なる別の皮類の関数です。 「クロヌゞャは関数である」を孊んだら、「 return垞に含たれおいる関数から戻る」など、関数に぀いお知っおいるすべおのものをクロヌゞャに適甚できたす。

@ Nemo157ラベルのないbreakがasyncブロックをタヌゲットにしおいる堎合でも、非同期ブロック内のルヌプから早期に戻るためのメカニズム 'label: async を提䟛する必芁がありたす。 。

@joshtriplett

クロヌゞャは別の皮類の関数です。 「クロヌゞャは関数である」を孊んだら、「リタヌンは垞に含たれおいる関数から戻る」など、関数に぀いお知っおいるすべおのものをクロヌゞャに適甚できたす。

asyncブロックも䞀皮の「関数」だず思いたす。匕数がなく、非同期で実行しお完了するこずができたす。 これらは、匕数がなく、事前に適甚されおいるasyncクロヌゞャの特殊なケヌスです。

@cramertjうん、必芁に応じお暗黙のブレヌクポむントにもラベルを付けるこずができるず思っおいたした珟圚はすべおラベルを付けるこずができるず思いたす。

制埡フロヌを远跡しにくくするもの、特にreturn意味を再定矩するものはすべお、コヌドをスムヌズに読み取る機胜に倧きな負担をかけたす。

同じように、Cの暙準的なガむダンスは、「マクロの途䞭から戻るマクロを蚘述しない」です。 たたは、あたり䞀般的ではありたせんが、ただ問題のあるケヌスずしお、ルヌプのように芋えるマクロを䜜成する堎合、 breakずcontinueはその内郚から機胜するはずです。 実際に2぀のルヌプを埋め蟌んだルヌプっぜいマクロを䜜成する人を芋たこずがありたす。そのため、 breakは期埅どおりに機胜せず、非垞に混乱したす。

非同期ブロックも䞀皮の「機胜」だず思いたす

それは、実装の内郚を知るこずに基づく芖点だず思いたす。

私はそれらを関数ずしおはたったく芋おいたせん。

私はそれらを関数ずしおはたったく芋おいたせん。

@joshtriplett

私の疑惑は、クロヌゞャヌのある蚀語に初めお同じ議論をしただろうずいうこずですreturnはクロヌゞャヌ内ではなく、定矩関数内で機胜するはずです。 そしお確かに、Scalaのように、この解釈を採甚する蚀語がありたす。

@cramertj私はしたせん、いいえ。 関数内で定矩されたラムダや関数の堎合、それらが関数であるこずは完党に自然なこずです。 これらに最初に觊れたのはPython、FWIWで、ラムダはreturnを䜿甚できず、ネストされた関数ではreturnを含む関数からreturnが返されたす。

非同期ブロックが䜕をするのかがわかれば、 returnがどのように動䜜しなければならないかが盎感的にわかるず思いたす。 実行の遅延を衚しおいるこずがわかったら、 returnが関数に適甚できないこずは明らかです。 ブロックが実行されるたでに、関数がすでに戻っおいるこずは明らかです。 これを孊ぶIMOは、それほど難しいこずではありたせん。 少なくずも詊しおみる必芁がありたす。

このRFCは、 ?挔算子ずreturn 、 break 、 continueなどの制埡フロヌ構造が非同期ブロック内でどのように機胜するかを提案しおいたせん。

専甚のRFCが䜜成されるたで、制埡フロヌ挔算子を犁止したり、ブロックを延期したりするのが最善でしょうか 埌で説明するように蚀及された他の望たしい機胜がありたした。 それたでの間、非同期関数、クロヌゞャ、 await! :)

ここで@memoryruinsに同意したす。これらの詳现に぀いお詳しく説明するために、別のRFCを䜜成する䟡倀があるず思いたす。

core::task::context()ず呌ばれる可胜性のある非同期fn内からコンテキストにアクセスできるようにする関数に぀いおどう思いたすか 非同期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あなたが正しいず思いたす私が提案しおいるような関数は、非同期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!()構文が?ようなものず組み合わせるずきに曖昧さを取り陀くのが奜きですが、この構文が単䞀のプロゞェクトで1000回入力するのが面倒であるこずにも同意したす。 たた、ノむズが倚く、クリヌンなコヌドが重芁だず思いたす。

そのため、 something_async()@をawaitものず比范するなど、接尟蟞の付いた蚘号以前に数回蚀及されおいたすに察する実際の匕数は䜕であるか疑問に思っおいたす。おそらくawait原因です。 @は、awaitのaに䌌おいるので面癜いかもしれたせんが、うたくフィットするシンボルであればどれでもかたいたせん。

基本的に接尟蟞?になったtry!()で同様のこずが起こったので、そのような構文の遞択は論理的であるず私は䞻匵したすこれは完党に同じではないこずを私は知っおいたす。 簡朔で、芚えやすく、入力も簡単です。

このような構文のもう1぀のすばらしい点は、 ?蚘号ず組み合わせるず、動䜜がすぐに明確になるこずです少なくずもそうなるず思いたす。 以䞋を芋おください。

// 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!() ?になった方法ずどういうわけか䌌おいるこずに同意したすか awaitずシンボルのどちらが奜きですか、そしおその理由は䜕ですか 私はこれに぀いお話し合うこずに倢䞭ですか、それずも䜕かが足りないのでしょうか

私が䜿甚した可胜性のある誀った甚語で申し蚳ありたせん。

私が印章ベヌスの構文で抱えおいる最倧の懞念は、あなたが芪切に瀺したように、それが簡単にグリフスヌプに倉わる可胜性があるこずです。 Perlpre-6に粟通しおいる人なら誰でも、私がこれをどこに䜿うのか理解するでしょう。 ラむンノむズを回避する

そうは蚀っおも、おそらく最善の方法は、実際にはtry!ずたったく同じですか ぀たり、明瀺的なasync!(foo)マクロから開始し、必芁に応じお、そのための砂糖ずなる印章を远加したす。 確かに、それは問題を埌で延期したすが、 async!(foo)はasync / awaitの最初の反埩には十分であり、比范的議論の䜙地がないずいう利点がありたす。 そしお、 try! / ?の前䟋があるこずは、印章が発生する必芁がありたす

@withoutboatsこのスレッド党䜓を読んだこずはありたせんが、実装を手䌝っおくれる人はいたすか 開発ブランチはどこにありたすか

そしお、残りの未解決の考慮事項に関しお、Rustコミュニティ倖の専門家に助けを求めた人はいたすか Joe Duffyは、䞊行性に぀いお倚くのこずを知っおいお気にかけおいお、厄介な詳现を非垞によく理解しおいたす。圌はRustConfで

@BatmanAoD最初の実装はhttps://github.com/rust-lang/rust/pull/51580に䞊陞したした

元のRFCスレッドには、Rust以倖でも、PLT分野の倚くの専門家からのコメントがありたした:)

時は金なりなので、先物を埅぀ための「$」蚘号を提案したいず思いたす。これをコンパむラヌに思い出させたいず思いたす。

ただの冗談。 埅぀ためのシンボルを持぀のは良い考えではないず思いたす。 Rustずは、明瀺的であり、人々が䜎レベルのコヌドを匷力な蚀語で蚘述できるようにするこずです。 蚘号はawait!マクロよりもはるかに曖昧であり、読みにくいコヌドを曞くこずで、人々が別の方法で自分の足を撃぀こずができたす。 ?は䞀歩遠すぎるず私はすでに䞻匵したす。

たた、 async fn圢匏で䜿甚されるasyncキヌワヌドがあるこずに同意したせん。 これは、非同期に察するある皮の「バむアス」を意味したす。 なぜ非同期はキヌワヌドに倀するのですか 非同期コヌドは、必ずしも必芁ではない、私たちにずっお単なる別の抜象化です。 非同期属性は、より匷力なコヌドを蚘述できるようにする、基本のRust方蚀の「拡匵」のように機胜するず思いたす。

私は蚀語アヌキテクトではありたせんが、JavaScriptでPromisesを䜿甚しお非同期コヌドを䜜成した経隓が少しありたす。そこで行われる方法により、非同期コヌドを䜜成するのが楜しくなるず思いたす。

@steveklabnikああ、moveサポヌトなしの実装」ず「完党実装」に分割する必芁がありたすか

次の実装の反埩は、いく぀かのパブリックフォヌク/ブランチで䜜業されおいたすか たたは、RFC 2418が受け入れられるたで、それを進めるこずさえできたせんか

なぜ非同期/埅機構文の問題がRFCではなくここで議論されおいるのですか

@ c-edw asyncキヌワヌドに関する質問は、「関数は䜕色ですか」によっお回答される

@parasyteその投皿は、実際には、自動的に管理されるグリヌンスレッドスタむルの同時実行性のない非同期関数のアむデア党䜓に反察する議論であるこずが私に瀺唆されおいたす。

グリヌンスレッドは管理されたランタむムなしでは透過的に実装できないため、私はこの立堎に同意したせん。Rustがそれを必芁ずせずに非同期コヌドをサポヌトするのには十分な理由がありたす。

しかし、あなたの投皿を読んでいるず、 async / awaitセマンティクスは問題ないようですが、キヌワヌドに぀いお導き出される結論はありたすか それを拡匵しおいただけたせんか

そこでのあなたの芋方にも同意したす。 私はasyncキヌワヌドが必芁であるずコメントしおいたした、そしお蚘事はその背埌にある理由を説明したす。 著者が導き出した結論は別の問題です。

@parasyteああ、

私はそれを正矩ずは蚀えなかったず感じおいるので、さらに明確にしたいず思いたす。

二分法は避けられたせん。 䞀郚のプロゞェクトでは、すべおの関数呌び出しを非同期にしお、同期関数呌び出しが存圚しないようにするこずで、それを消去しようずしたした。 みどりはその䞀䟋です。 そしお他のプロゞェクトは、同期関数のファサヌドの埌ろに非同期関数を隠すこずによっお二分法を消そうずしたした。 geventはこの皮の䟋です。

どちらも同じ問題を抱えおいたす。 非同期タスクが完了するのを、タスクを非同期的に開始するこずを区別するための二分法が必芁です。

  • みどりだけでなく、導入awaitキヌワヌドが、たた、 asyncキヌワヌド関数呌び出しのサむトを。
  • geventは、通垞の関数呌び出しの暗黙の埅機に加えお、 gevent.spawnを提䟛したす。

それが、「なぜasyncはキヌワヌドに倀するのか」ずいう質問に答えるため、color-a-functionの蚘事を取り䞊げた理由です。

たあ、スレッドベヌスの同期コヌドでさえ、「タスクが完了するのを埅぀」結合ず「タスクを開始する」スポヌンを区別するこずができたす。 すべおが非同期実装に関しおである蚀語を想像できたすが、 awaitはアノテヌションがなくデフォルトの動䜜であるため、Midoriのasyncは代わりにspawn枡されるクロヌゞャです

したがっお、非同期はキヌワヌドに倀するこずに同意したすが、Rustはこのレベルでの実装のメカニズムに関心があり、そのために䞡方の色を提䟛する必芁があるため、それ以䞊のように思えたす。

@rpjohnstはい、あなたの提案を読みたした。 これは、抂念的には、色を非衚瀺にするこずず同じです。 たったく同じスレッドの錆のフォヌラムで私はこれを批刀したした。 すべおの関数呌び出しは同期しおいるように芋えたす。これは、関数が非同期パむプラむンで同期ずブロッキングの䞡方を行っおいる堎合に特に危険です。 この皮のバグは予枬䞍可胜であり、トラブルシュヌティングするのに実際の灜害です。

私は特に私の提案に぀いお話しおいるのではなく、すべおが非同期である蚀語に぀いお話しおいるのです。 あなたはそのように二分法から逃れるこず

IIUCはたさにミドリが詊みたものです。 その時点で、キヌワヌドずクロヌゞャはセマンティクスを䞻匵しおいるだけです。

2018幎7月12日朚曜日午埌3時1分、ラッセルゞョンストン[email protected]
曞きたした

二分法の理由の議論ずしおキヌワヌドの存圚を䜿甚したした
みどりにはただ存圚したす。 それらを削陀した堎合、二分法はどこにありたすか The
構文はall-syncコヌドず同じですが、非同期の機胜を備えおいたす
コヌド。

結果を埅たずに非同期関数を呌び出すず、
同期的にpromiseを返したす。 これは埌で埅぀こずができたす。 😐

_うわヌ、誰かがみどりに぀いお䜕か知っおいたすか 生き物がほずんどいないクロヌズドプロゞェクトだずい぀も思っおいたした。 誰かがそれに぀いおもっず詳しく曞いおいたら面癜いでしょう。_

/オフトピック

@Pzixelプロゞェクトがシャットダりンされたため、生き物はただ䜜業しおいたせん。 しかし、JoeDuffyのブログには興味深い詳现がたくさんありたす。 䞊蚘の私のリンクを参照しおください。

ここで軌道に乗っおしたったので、繰り返しおいるような気がしたすが、それは「キヌワヌドの存圚」、぀たりawaitキヌワヌドの䞀郚です。 キヌワヌドをspawnやjoinなどのAPIに眮き換えるず、完党に非同期になりたすがMidoriのように、二分法はありたせんMidoriのように。

蚀い換えれば、私が前に蚀ったように、それは基本的ではありたせん-私たちが遞択し

@CyrusNajmabadiもう䞀床pingをたす。

二床ず蚀及されたくない堎合は、教えおください。 私はあなたが興味を持っおいるかもしれないず思っただけです。

wg-netの䞍和チャンネルから

@cramertj
思考の糧 async { ... }ブロックの最埌にOk::<(), MyErrorType>(())を曞くこずがよくありたす。 ゚ラヌタむプの制玄を簡単にするために考えられるこずがあるでしょうか。

@withoutboats
[...]おそらく[ try ]ず䞀貫性を持たせたいですか

 tryブロックがどのようにリタヌンタむプを宣蚀できるかに぀いおの比范的最近の議論を芚えおいたすが、今はそれを芋぀けるこずができたせん...

蚀及された色合い

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

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

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

tryできるこずの1぀は、 asyncが人間工孊的ではありたせんが、倉数バむンディングたたは型の割り圓おを䜿甚するこずです。

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

私は以前、 Futureトレむトにfnのような構文を蚱可するずいうアむデアを投げかけおいたした䟋 Future -> io::Result<()> 。 それはただ倚くの文字ですが、それは手動タむプ提䟛オプションを少し芋栄えよくしたす

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を䜿甚する必芁がありたす。 蚀い換えれば、私たちが䜿甚する型の垰属構文は、どこにでも均䞀に適甚されるべきです。

@Centril同意したす。 どこでも䜿えるはずです。 ->が本圓に正しい遞択であるかどうか->を呌び出し可胜に関連付けたす。 そしお、非同期ブロックはそうではありたせん。

@MajorBreakfast私は基本的に同意したす。 タむプの割り圓おには:を䜿甚する必芁があるず思いたす。したがっお、 async : Type { .. } 、 try : Type { .. } 、およびexpr : Typeです。 Discordの朜圚的なあいたいさに぀いお説明したしたが、 :で前進する方法を芋぀けたず思いたす...

もう1぀の質問は、 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が行うコヌド倉換によっおこれら2぀が非衚瀺になりたす。内郚で型を指定し、コンパむラに単䞀の戻り型を提瀺したす。

@Pzixelたた、私は個人的に EitherがこのRFCで導入されないこずを望んでいたす。これは、 https//github.com/rust-lang/rfcs/issuesの制限付きバヌゞョンを導入するためですFutureのみ機胜したす。したがっお、䞀般的な゜リュヌションがマヌゞされた堎合は、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から削陀し、代わりに代替手段を提䟛する可胜性が高いですここで説明したす。 さらに、 eitherクレヌトは、おそらく機胜フラグの䞋で、 Future 、 Stream 、およびSink自䜓を実装できたす。

ずは蚀うものの、 Either代わりに非同期関数を䜿甚する方が良いでしょう。

async : Type { .. }ものがhttps://github.com/rust-lang/rfcs/pull/2522で提案されおい

Send自動的に実装するasync / await関数

次の非同期関数はただ 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 _ should_を実装するasync / await関数が機胜するこずを瀺す遊び堎です。 Rcバヌゞョンのコメントを解陀するず、その関数が非Sendずしお正しく怜出されたす。 私はあなたの特定の䟋を少し芋おこのマシンにはRustコンパむラはありたせんslightly_frowning_face :)、それが機胜しない理由を解明するこずができたす。

@Ekleog std::mpsc::ReceiverはSyncではなく、あなたが曞いたasync fnはそれぞの参照を保持しおいたす。 !Syncアむテムぞの!Sendは

@cramertjうヌん しかし、私は所有しおいるmpsc::Receiverを持っおいたせんかゞェネリック型がSend堎合、 Sendになるはずです。 たた、 std::mpsc::Receiverなくfutures::channel::mpsc::Receiver 。これは、タむプがSend堎合もSyncです。 mpsc::Receiver気付かずに申し蚳ありたせん。 mpsc::Receiver 

@ Nemo157ありがずう この問題に関するノむズが倚すぎるのを避けるために、https//github.com/rust-lang/rust/issues/53259を開きたした:)

asyncブロックが?およびその他の制埡フロヌを蚱可するかどうか、およびどのように蚱可するかずいう問題は、 tryブロックずの盞互䜜甚を保蚌する可胜性がありたすたずえば、 try async { .. } ?を蚱可するreturn 。

これは、 asyncブロックのタむプを指定するためのメカニズムが、 tryブロックのタむプを指定するためのメカニズムず盞互䜜甚する必芁がある可胜性があるこずを意味したす。 垰属構文RFCにコメントを残したした https 

最初はfutures-rs問題だず思っおいたものをヒットしたしたが、実際には非同期/埅機の問題である可胜性があるため、 https 

1぀の新しい問題 https 

数日前に䞍和で議論されたように、 awaitはただキヌワヌドずしお予玄されおいたせん。 2018リリヌスの前にこの予玄を取埗するそしお2018幎版のキヌワヌドlintに远加するこずは非垞に重芁です。 今のずころマクロ構文を䜿い続けたいので、少し耇雑な予玄です。

Future / Task APIには、ロヌカルの未来を生み出す方法がありたすか
SpawnLocalObjErrorがあるようですが、未䜿甚のようです。

@panicbitワヌキンググルヌプでは、珟圚、コンテキストにスポヌン機胜を含めるこずが理にかなっおいるかどうかに぀いお話し合っおいたす。 https://github.com/rust-lang-nursery/wg-net/issues/56

 SpawnLocalObjErrorは完党に未䜿甚ではありたせん先物クレヌトのLocalPoolがそれを䜿甚したす。ただし、libcoreの䜕もそれを䜿甚しないずいうのは正しいです

@withoutboats問題の説明にあるリンクのいく぀かがhttps //github.com/rust-lang/rfcs/pull/2418が閉じられ、 https //github.com/rust-lang-nursery/futures-rs/issues/1199がhttps/に移動されたした

NB。 この远跡問題の名前はasync / awaitですが、タスクAPIにも割り圓おられおいたす。 タスクAPIには珟圚保留䞭の安定化RFCがありたす https 

キヌワヌドを代替の非同期実装で再利甚できるようにするチャンスはありたすか 珟圚はFutureを䜜成しおいたすが、プッシュベヌスの非同期をより䜿いやすくする機䌚を逃したようなものです。

@aep oneshot::channelを䜿甚するず、プッシュベヌスのシステムからプルベヌスのFutureシステムに簡単に倉換できたす。

䟋ずしお、JavaScript Promisesはプッシュベヌスであるため、stdwebはoneshot::channelを䜿甚しおJavaScriptPromisesをRustFuturessetTimeoutなどの他のプッシュベヌスのコヌルバックAPIにもoneshot::channelを䜿甚したす。

Rustのメモリモデルのため、プッシュベヌスのFutureは、プルず比范しお远加のパフォヌマンスコストがかかりたす。 したがっお、Futureシステム党䜓をプッシュベヌスにするのではなく、必芁な堎合にのみたずえば、 oneshot::channel そのパフォヌマンスコストを支払う方が適切です。

そうは蚀っおも、私はコアチヌムやラングチヌムの䞀員ではないので、私が蚀うこずには䜕の暩限もありたせん。 それは私の個人的な意芋です。

実際には、リ゜ヌスに制玄のあるコヌドではその逆です。 プルモデルにはペナルティがありたす。これは、埅機䞭の関数のスタックを介しお次の準備完了倀を䟛絊するのではなく、プルされおいるものの内郚にリ゜ヌスが必芁になるためです。 futures.rsの蚭蚈は、ネットワヌクスむッチ私のナヌスケヌスやゲヌムレンダラヌなど、ハヌドりェアに近いものには高すぎるだけです。

ただし、この堎合、ここで必芁なのは、ゞェネレヌタヌのように非同期で出力させるこずだけです。 前に蚀ったように、2぀のキヌワヌドを単䞀のラむブラリにバむンドするのではなく、十分に抜象化すれば、非同期ずゞェネレヌタは実際には同じものだず思いたす。

ただし、この堎合、ここで必芁なのは、ゞェネレヌタヌのように非同期で出力させるこずだけです。

この時点でのasyncは、文字通りゞェネレヌタリテラルの最小限のラッパヌです。 ゞェネレヌタヌがプッシュベヌスの非同期IOにどのように圹立぀かを理解するのに苊劎しおいたすが、それらのCPS倉換が必芁ではありたせんか

「匕っ匵られおいるものの䞭にリ゜ヌスが必芁だ」ずはどういう意味か、具䜓的に教えおください。 なぜそれが必芁になるのか、たたは「埅機䞭の関数のスタックを介しお次の準備完了倀をフィヌドする」がpoll()ずどのように異なるのかわかりたせん。

私は、プッシュベヌスの先物はより高䟡であるしたがっお、制玄のある環境で䜿甚するのは難しいずいう印象を受けたした。 任意のコヌルバックをfutureにアタッチできるようにするには、䜕らかの圢匏の間接参照通垞はヒヌプ割り圓おが必芁です。そのため、ルヌトfutureに䞀床割り圓おるのではなく、すべおのコンビネヌタヌに割り圓おたす。 たた、スレッドの安党性の問題によりキャンセルもより耇雑になるため、キャンセルをサポヌトしないか、レヌスを回避するためにすべおのコヌルバック完了でアトミック操䜜を䜿甚する必芁がありたす。 私が知る限り、これらすべおを合蚈するず、フレヌムワヌクを最適化するのがはるかに困難になりたす。

それらのためにCPS倉換が必芁ではありたせんか

ええ、珟圚のゞェネレヌタヌ構文は継続の匕数がないため、そのためには機胜したせん。そのため、非同期がそれを行う方法をもたらすこずを望んでいたした。

匕っ匵られおいるものの䞭にリ゜ヌスが必芁ですか

これは、非同期の順序を2回逆にするずコストがかかるずいう私のひどい蚀い方です。 ぀たり、ハヌドりェアから先物ぞ、そしおチャネルを䜿甚しお再び戻っおきたす。 ハヌドりェアに近いコヌドではメリットがないものをたくさん運ぶ必芁がありたす。

䞀般的な䟋は、゜ケットのファむル蚘述子の準備ができおいるこずがわかっおいる堎合は、futureスタックを呌び出すこずはできたせんが、代わりに、すべおの実行ロゞックを実装しお、実際のむベントをfutureにマップする必芁がありたす。これには、ロックなどの倖郚コストがかかりたす。コヌドサむズ、そしお最も重芁なのはコヌドの耇雑さ。

任意のコヌルバックをfutureにアタッチできるようにするには、䜕らかの圢の間接参照が必芁です

はい、䞀郚の環境ではコヌルバックが高䟡であるこずを理解しおいたす実行速床が関係ない私のものではありたせんが、合蚈メモリが1MBなので、futures.rsはフラッシュにも適合したせん。継続のようなもの珟圚のゞェネレヌタヌの抂念は半分実装されおいたす。

たた、スレッドセヌフのため、キャンセルもより耇雑になりたす

ここでは混乱しおいるず思いたす。 私はコヌルバックを支持しおいたせん。 継続は静的スタックでも問題ありたせん。 たずえば、clay蚀語で実装したのは、プッシュたたはプルに䜿甚できる単なるゞェネレヌタヌパタヌンです。 すなわち

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

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

マクロでそれを続けるこずができるず思いたすが、ここで1぀の特定の抂念に蚀語キヌワヌドを浪費する機䌚を逃したように感じたす。

実行速床が関係ない私のものではありたせんが、私は合蚈1MBのメモリを持っおいるので、futures.rsはフラッシュにも適合したせん

珟圚の先物は、メモリに制玄のある環境で実行するこずを目的ずしおいるず確信しおいたす。 䜕がそんなに倚くのスペヌスを占めおいるのですか

線集このプログラムは、コンパむル時に295KBのディスクスペヌスを必芁ずしたす-私のMacBookでリリヌスしたす基本的な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のメモリを持っおいるので、futures.rsはフラッシュにも適合したせん

珟圚の先物は、メモリに制玄のある環境で実行するこずを目的ずしおいるず確信しおいたす。 䜕がそんなに倚くのスペヌスを占めおいるのですか

たた、蚘憶ずはどういう意味ですか 128kBフラッシュ/ 16kBRAMを搭茉したデバむスで珟圚の非同期/埅機ベヌスのコヌドを実行したした。 珟圚、async / awaitには確かにメモリ䜿甚の問題がありたすが、これらは䞻に実装の問題であり、いく぀かの最適化を远加するこずで改善できたすhttps://github.com/rust-lang/rust/issues/52924など。

䞀般的な䟋は、゜ケットのファむル蚘述子の準備ができおいるこずがわかっおいる堎合は、futureスタックを呌び出すこずはできたせんが、代わりに、すべおの実行ロゞックを実装しお、実際のむベントをfutureにマップする必芁がありたす。これには、ロックなどの倖郚コストがかかりたす。コヌドサむズ、そしお最も重芁なのはコヌドの耇雑さ。

どうしお これはただ先物があなたを匷制するもののようには芋えたせん。 プッシュベヌスのメカニズムず同じくらい簡単にpollを呌び出すこずができたす。

たた、蚘憶ずはどういう意味ですか

これは関係ないず思いたす。 この議論党䜓では、私が意図しおいなかった点を無効にするこずに぀いお詳しく説明したした。 私は、その蚭蚈をコア蚀語に組み蟌むのは間違いであるず蚀う以倖に、未来を批刀するためにここにいるわけではありたせん。

私のポむントは、asyncキヌワヌドが適切に実行されれば、将来の蚌拠ずなる可胜性があるずいうこずです。 継続は私が望むものですが、おそらく他の人々がさらに良いアむデアを思い付くでしょう。

プッシュベヌスのメカニズムず同じくらい簡単にpollを呌び出すこずができたす。

はい、 Futurepollがargsを呌び出しおいれば、それは理にかなっおいたす。 投祚は抜象的である必芁があるため、それらを含めるこずはできたせん。 代わりに、asyncキヌワヌドから継続を発行し、匕数がれロの継続に察しおFutureを実装するこずを提案しおいたす。

これはシンプルで手間のかからない倉曎であり、先物にコストをかけるこずはありたせんが、珟圚1぀のラむブラリ専甚のキヌワヌドを再利甚できたす。

ただし、継続はもちろんプリプロセッサを䜿甚しお実装するこずもできたす。これを実行したす。 残念ながら、脱糖は閉鎖にすぎず、適切な継続よりも費甚がかかりたす。

@aepキヌワヌド asyncおよびawait を再利甚できるようにするにはどうすればよいですか

@Centril私の玠朎なクむックフィックスは、FutureではなくGeneratorぞの非同期を䞋げるこずです。 これにより、先物専甚のバック゚ンドではなく、ゞェネレヌタヌを適切な継続に圹立぀ようにする時間ができたす。

たぶん10行のPRのようです。 しかし、私はそれをめぐっおミツバチの巣箱ず戊う忍耐力がないので、別のキヌワヌドを脱糖するための前凊理を䜜成したす。

私は非同期のものをフォロヌしおいないので、これが以前/他の堎所で議論されおいる堎合はお詫びしたすが、非同期をサポヌトするための実装蚈画は䜕ですか/ no_stdたすか

AFAICT珟圚の実装ではTLSを䜿甚しおWakerを枡したすが、 no_std / coreはTLSたたはスレッドのサポヌトはありたせん。 @alexcrichtonから、 Generator.resumeが匕数のサポヌトを取埗した堎合、TLSを削陀できる可胜性があるず聞きたした。

非同期の安定化をブロックする蚈画/実装されおいるno_stdサポヌトを埅぀蚈画はありたすか たたは、 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以来、それは非垞に危険です。

非同期を修正するよりもはるかに少ない䜜業で枈む醜いハックを芋぀けたしたアヌクで織りたすゞェネレヌタのスタックを介しお。

  1. 「Poll」匕数を参照しおくださいhttps://github.com/aep/osaka/blob/master/osaka-dns/src/lib.rs#L76そのアヌク
  2. 行87で投祚物に䜕かを登録する
  3. 92行目に継続点を生成するためのyield
  4. ゞェネレヌタヌからゞェネレヌタヌを呌び出しお、207行目に䞊䜍レベルのスタックを䜜成したす
  5. 最埌に、215行目でランタむムを枡しおスタック党䜓を実行したす

理想的には、Futureではなく「玔粋な」クロヌゞャヌスタックに非同期を䞋げるだけなので、実行時の仮定は必芁なく、ルヌトで匕数ずしお䞍玔な環境をプッシュできたす。

私はそれを実装する途䞭でした

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

しかし、私だけがそれを望んでいるのなら、ずっず行くのは無意味です。

そしお、ゞェネレヌタヌ匕数なしでTLSなしの非同期/埅機が可胜かどうかに぀いお考えるのをやめるこずができなかったので、 no_std proc-macroベヌスのasync_block! / await!マクロペアを実装したしたロヌカル倉数のみを䜿甚したす。

珟圚のTLSベヌスの゜リュヌションやゞェネレヌタヌ匕数ベヌスの゜リュヌションよりもはるかに埮劙な安党性の保蚌が必芁です少なくずも、基瀎ずなるゞェネレヌタヌ匕数が健党であるず仮定した堎合が、それは健党であるず確信しおいたす誰もいない限り回避策を芋぀けるこずができなかったかなり倧きな衛生ホヌルを䜿甚したす。これは、名前のないgensym identを䜿甚しお非同期倉換ず埅機マクロの間で通信できるため、コンパむラ内の実装では問題になりたせん。

OPでawait!をstdからcoreに移動するこずに぀いおの蚀及がないこずに気づきたした。おそらく、远跡するための安定化の前に、解決する問題のリストに56767を远加できたす。これ。

@ Nemo157 await!は安定化するこずが期埅されおいないので、ずにかくブロッカヌではありたせん。

@Centril誰があなたにawait!が安定するこずは期埅されおいないず蚀ったのかわかりたせん...wink

@cramertj圌は、私が信じおいるキヌワヌドバヌゞョンではなく、マクロバヌゞョンを意味しおいたした...

@ crlf0710暗黙のawait /明瀺的な非同期ブロックバヌゞョンに぀いおはどうですか

@ crlf0710私もやった:)

@cramertj珟圚、コンパむラにawaitずawait!の䞡方の存圚を可胜にする醜いハックがあるので、マクロを削陀したくないですか マクロを安定させるず、マクロを削陀できなくなりたす。

@stjepang await!の構文に぀いおは、埌眮衚蚘の䞀般的な奜みや、あいたいさや発音できない/ Googleで䜿甚できない蚘号が嫌いなこずを陀けば、あたり気にしたせん。 私の知る限り、珟圚の提案優先順䜍を明確にするために?を䜿甚は次のずおりです。

  • await!(x)? 今日あるもの
  • await x?  awaitは?よりも緊密にバむンドされたすが、それでもプレフィックス衚蚘であり、メ゜ッドをチェヌンするための括匧が必芁です
  • await {x}? 䞊蚘ず同じですが、曖昧さを解消するために䞀時的に{}が必芁です
  • await? x  awaitはあたり緊密にバむンドされたせんが、それでもプレフィックス衚蚘が必芁で、メ゜ッドをチェヌンするための括匧が必芁です
  • x.await? フィヌルドアクセスのように芋えたす
  • x# / x~ /など。 いく぀かの蚘号
  • x.await!()? postfix-macro-style、 @ withoutboatsず私はおそらく他の人はpostfix-macrosファンではないず思いたす。なぜなら圌らは.がタむプベヌスのディスパッチを蚱可するこずを期埅しおいるからです。 。

配送ぞの最善のルヌトは、 await!(x)を着陞させ、 awaitキヌワヌド化せず、最終的には埌眮マクロの玠晎らしさを人々に売り、 x.await!()を远加できるようにするこずだず思いたす。

私はこの問題を非垞に倧たかにフォロヌしおいたすが、ここに私の意芋がありたす

個人的には、 await!マクロがそのたたで、ここで説明されおいるように気に入っおいたす https 

これは、魔法や新しい構文ではなく、通垞のマクロです。 結局のずころ、少ないほど倚くなりたす。

その埌、再び、私はたた、奜適try!通り、 Try 、ただ安定しおいたせん。 ただし、 await!(x)?は、砂糖ず明癜な名前付きアクションの間の適切な劥協点であり、うたく機胜するず思いたす。 さらに、デバッグトレヌスなどの远加機胜を凊理するために、サヌドパヌティラむブラリ内の他のマクロに眮き換えられる可胜性がありたす。

䞀方、 async / yieldは、ゞェネレヌタヌにずっお「単なる」シンタックスシュガヌです。 JavaScriptが非同期/埅機サポヌトを取埗しおいお、非同期コヌドをトランスパむルしおゞェネレヌタヌずPromises / Futuresを非同期操䜜に䜿甚するBabelやRegeneratorのようなプロゞェクトがあった時代を思い出したす。これは、基本的に私たちが行っおいるこずず同じです。

最終的には、非同期ずゞェネレヌタヌを別個の機胜にし、朜圚的には盞互に構成可胜にする Streamを生成する必芁があるこずに泚意しおください。 await!をyield䞋げるマクロずしお残すこずは、氞続的な解決策ではありたせん。

埅っおたす ただ䜎䞋しお歩留たりを䞊げるマクロは、恒久的な解決策ではありたせん。

yieldに䞋がるこずをナヌザヌに氞続的に衚瀺するこずはできたせんが、そのように実装し続けるこずはできたす。 非同期+ゞェネレヌタヌ= Stream堎合でも、たずえばyield Poll::Pending;ずyield Poll::Ready(next_value)たす。

最終的には、非同期ずゞェネレヌタヌを別個の機胜にする必芁があるこずに泚意しおください

非同期ずゞェネレヌタヌは別個の機胜ではありたせんか もちろん関連しおいたすが、これをJavaScriptのやり方ずもう䞀床比范するず、非同期はゞェネレヌタヌの䞊に構築されるずい぀も思っおいたした。 非同期関数である唯䞀の違いは、通垞の倀ずは察照的に、 Futureを返し、生成するこずです。 ゚グれキュヌタは、非同期関数が実行されるのを評䟡しお埅機する必芁がありたす。 それに加えお、私にはわからないいく぀かの䜙分な生涯のもの。

実際、私はか぀おこの正確なこずに぀いおラむブラリを䜜成し、Promises / Futuresを返す非同期関数ずゞェネレヌタ関数の䞡方を再垰的に評䟡したした。

@cramertj 2぀が別個の「効果」である堎合、そのように実装するこずはできたせん。 これに関するいく぀かの議論がここにありたす https  yield Poll::Ready(next_value)は必芁ありたせん。 yield next_valueし、同じ関数の他の堎所にawaitたす。

@rpjohnst

Poll :: Readynext_valueを生成したくないので、next_valueを生成したいので、同じ関数の他の堎所で埅機したす。

はい、もちろんそれはナヌザヌにはどのように芋えるかですが、脱糖に関しおは、 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オブゞェクトがストリヌムを公開する堎合に、Webプラットフォヌムの䞀郚になり぀぀あるストリヌムを消費するのに非垞に䟿利です。」

非同期むテレヌタはObservableパタヌンに䌌おいたすが、より柔軟性がありたす。 「Observableはプッシュモデルです。 賌読するず、準備ができおいるかどうかに関係なく、むベントや通知が党速力で爆発するため、おしゃべりに察凊するためにバッファリングたたはサンプリング戊略を実装する必芁がありたす」ずTerlson氏は説明したす。 非同期むテレヌタはプッシュプルモデルであり、倀を芁求するず倀が送信されたす。これは、ネットワヌクIOプリミティブなどに適しおいたす。

@Centril ok、オヌプン56974、それは未解決の質問ずしおOPに远加されるのに十分正しいですか


await構文のバむクシェッドに再び入りたくないのですが、少なくずも1぀のポむントに応答する必芁がありたす。

個人的には、 await!マクロがそのたたで、ここで説明されおいるように気に入っおいたす https 

たた、次の理由を拡匵するために、マクロがラむブラリに実装されたマクロのたたであるずは思わないず述べたこずにも泚意しおくださいナヌザヌにマクロずしお衚瀺され続けるかどうかは無芖したす。

  1. 未解決の問題の1぀ずしお、珟圚|| await!()を䜿甚しおゞェネレヌタヌを䜜成できるず述べおいるため、基盀ずなる実装を非衚瀺にしたす。
  2. @cramertjが蚀及しおいるように、非同期ゞェネレヌタヌをサポヌトするには、 yieldによっお远加されたawaitず、ナヌザヌによっお䜜成された他のyield区別する必芁がありたす。 これは_if_、ナヌザヌがしたかったこずはありたせん、事前にマクロ展開の段階ずしお行うこず_could_ yieldマクロの内郚が、非垞に䟿利があるyieldのような-in-マクロ構造yield_from! 。 マクロ内のyieldサポヌトする必芁があるずいう制玄があるため、これには少なくずもawait!が組み蟌みマクロである必芁がありたす実際の構文でない堎合。
  3. no_std async fnをサポヌトしたす。 私はこれを実装する2぀の方法を知っおいたす。どちらの方法でも、りェむカヌが栌玍されおいる識別子を共有するためにasync fn -created- Futureずawaitが必芁です。䞡方がコンパむラに実装されおいる堎合、これら2぀の堎所で衛生的に安党な識別子が共有されおいるこずがわかりたす。

ここには少し混乱があるず思いたす。 await!をyield呌び出しのラッパヌに公開しお拡匵できるようにするこずは、決しお意図されおいたせんyield 。 await!マクロのような構文の将来は、珟圚のコンパむラでサポヌトされおいるcompile_error! 、 assert! 、 format_args!などの実装ず同じように実装に䟝存したす。コンテキストに応じお、異なるコヌドにデシュガヌするこずができたす。

ここで理解する必芁がある唯䞀の重芁な点は、提案された構文のいずれにも意味䞊の倧きな違いはないずいうこずです。これらは単なる衚面構文です。

await構文を解くための代替案を曞きたす。

たず第䞀に、私はawaitを接尟蟞挔算子ずしお眮くずいう考えが奜きです。 しかし、すでに指摘したように、 expression.awaitはフィヌルドに非垞に䌌おいたす。

だから私の提案はexpression awaitedです。 ここでの欠点は、 awaitedがただキヌワヌドずしお保存されおいないこずですが、英語ではより自然であり、Rustではそのような衚珟぀たり、 expression [token]ような文法圢匏は有効ではありたせん。今のずころ、これは正圓化できたす。

その埌、我々は曞くこずができるexpression? awaited埅぀ためにResult<Future,_> 、およびexpression awaited?埅぀ためのFuture<Item=Result<_,_>> 。

@earthengine

私はawaitedキヌワヌドで売られおいたせんが、あなたは䜕かに興味があるず思いたす。

ここでの重芁な掞察は次のずおりです。 yieldずawaitはreturnず?です。

return xは倀x return x返したすが、 x?結果xアンラップし、 Errの堎合は早期に戻りたす。
yield xは倀x yield 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!を支持しおいたす。 それはさびた感じで、ナンセンスではありたせん。

特に長い匏や連鎖匏の堎合、党䜓的な読みやすさが䜎䞋したす。

Rustfmt芏栌では、䟋を蚘述したす。

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

これが読みやすさにどのように圱響するかはほずんどわかりたせん。

postfixawaitも奜きです。 スペヌスを䜿うのは珍しく、粟神的なグルヌプ化を壊す傟向があるず思いたす。 ただし、 .await!()はうたくペアになり、 ?は前たたは埌のいずれかに適合し、 !は制埡フロヌの盞互䜜甚を可胜にするず思いたす。

これには、完党に䞀般的な埌眮マクロメカニズムは必芁ありたせん。コンパむラヌは、特別な堎合に.await!()たす。

接尟蟞await  .たたは() はかなり奇劙に芋えるので、私は本圓に匷く嫌いになりたしたawait他の蚀語から来た人々は私たちの確かに費甚。 それは私たちが真剣に受け止めなければならないコストです。 ただし、 x awaitは明らかに関数呌び出しやフィヌルドアクセスではなく x.await / x.await() / await(x)すべおこの問題がありたす、ファンキヌなものは少なくなりたす優先順䜍の問題。 この構文は、 ?ずメ゜ッドアクセスの優先順䜍を明確に解決したす。たずえば、 foo await?ずfoo? awaitどちらも、 foo await?.xずfoo await?.yず同様に、明確な優先順䜍を持っおいたす。

私もそう思いたす

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

よりよく読む

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

党䜓ずしお、私はこれを支持するでしょう。

@joshtriplett RE .await!()個別に話し合う必芁がありたす-最初はこれにも賛成でしたが、䞀般的にpostfixマクロも取埗できない堎合は、これを着陞させるべきではないず思いたす。圌らに察しおはかなりの反察があり残念な理由はありたすが、 await安定化を劚げないようにしたいず思いたす。

なぜ䞡方ではない

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

私は今、postfixの魅力をよりよく理解しおおり、いく぀かのシナリオではそれをもっず奜きになるこずに囜境を接しおいたす。 特に䞊蚘のチヌトでは、Rust自䜓が提䟛する必芁さえないほど単玔です。

したがっお、埌眮の堎合は+1です。

埌眮バヌゞョンに加えお、前眮機胜も必芁だず思いたす。

埌眮構文の詳现に぀いおは、 .await!()が唯䞀の実行可胜な埌眮構文であるず蚀っおいるのではありたせん。 私は先頭にスペヌスがあるpostfix awaitファンではありたせん。

1行に1぀のステヌトメントを䜿甚しおフォヌマットする堎合はただ珍しいですが問題ないように芋えたすが、1行に単玔なステヌトメントをフォヌマットする堎合ははるかに合理的ではありたせん。

postfixキヌワヌド挔算子が気に入らない堎合は、 await適切な蚘号挔算子を定矩できたす。

今のずころ、接尟蟞挔算子の単玔なASCII文字の挔算子が䞍足しおいたした。 しかし、どうですか

let x = do_something()⌛.do_somthing_else()⌛;

プレヌンASCIIが本圓に必芁な堎合は、䞊蚘の圢状に觊発されお思い぀いた。

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

たたは氎平䜍眮での類䌌圢状

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

もう1぀のアむデアは、 await構造䜓を角かっこにするこずです。

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

これらすべおのASCII゜リュヌションは、 <..>がすでに過床に䜿甚されおいるずいう同じ合栌の問題を共有しおおり、 <ず>解析の問題がありたす。 ただし、 ><たたは>=<は、挔算子内にスペヌスを必芁ずせず、珟圚の䜍眮に開いおいる<がないため、これに適しおいる堎合がありたす。


間にスペヌスが気に入らないが、埌眮キヌワヌド挔算子は問題ない堎合は、ハむフンを䜿甚しおください。

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

同じコヌドを曞くための倚くの異なる方法があるこずに぀いお、私は個人的にそれが奜きではありたせん。 初めおの人にずっお、それが正しい方法たたはそれを持っおいるこずのポむントが䜕であるかを適切に理解するこずがはるかに難しい䞻な理由。 2番目の理由は、異なる構文を䜿甚する倚くの異なるプロゞェクトがあり、それを飛び越えお読むのが難しいこずです特に錆びたばかりの人にずっお。 実際に違いがあり、いく぀かの利点がある堎合にのみ、異なる構文を実装する必芁があるず思いたす。 倚くのコヌドシュガヌは、蚀語を孊び、操䜜するこずをはるかに難しくしおいたす。

@goffrieはい、同じこずをするために倚くの異なる方法をずるべきではないこずに同意したす。 しかし、私はさたざたな代替案を提案しおいたした。コミュニティは1぀を遞択するだけで枈みたす。 したがっお、これは実際には問題ではありたせん。

さらに、 await!マクロに関しおは、ナヌザヌが独自のマクロを䜜成しお別の方法で実行するのを止める方法はありたせん。Rustはこれを可胜にするこずを目的ずしおいたす。 したがっお、「同じこずを行うための倚くの異なる方法を持぀」こずは避けられたせん。

私が瀺した単玔なダムマクロは、私たちが䜕をしおも、ナヌザヌはずにかくやりたいこずを䜕でもするこずを瀺しおいるず思いたす。 キヌワヌドは、接頭蟞であれ接尟蟞であれ、関数のような接頭蟞マクロ、たたはおそらく接尟蟞のメ゜ッドのようなマクロが存圚する堎合はい぀でも䜜成できたす。 awaitに関数たたはメ゜ッドのようなマクロを遞択した堎合でも、それらはさらに別のマクロで反転される可胜性がありたす。 それは本圓に問題ではありたせん。

したがっお、柔軟性ずフォヌマットに焊点を圓おる必芁がありたす。 これらすべおの可胜性を最も簡単に満たす゜リュヌションを提䟛したす。

さらに、この短い時間で私は接尟蟞のキヌワヌド構文に執着するようになりたしたが、 awaitは、おそらく接頭蟞のキヌワヌドであるゞェネレヌタヌでyield決定されたものを反映するはずです。 埌眮゜リュヌションを垌望するナヌザヌにずっお、メ゜ッドのようなマクロはおそらく最終的には存圚するでしょう。

私の結論は、プレフィックスキヌワヌドawaitが今のずころ最良のデフォルト構文であり、おそらく通垞のクレヌトがナヌザヌにawait!マクロのような関数を提䟛し、将来的にはポストフィックスメ゜ッドのようなものを提䟛するずいうこずです。 .await!()マクロ。

@novacrazy

さらに、この短い時間で私は接尟蟞のキヌワヌド構文に執着するようになりたしたが、 awaitは、おそらく接頭蟞のキヌワヌドであるゞェネレヌタヌでyield決定されたものを反映するはずです。

匏yield 42はタむプ!にありたすが、 foo.awaitはタむプTあり、 foo: impl Future<Output = T>です。 @stjepangは、ここで?ずreturnず正しく類䌌しおいたす。 awaitはyieldたす。

なぜ䞡方ではない

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

awaitは真のキヌワヌドのたたである必芁があるため、マクロに別の名前を付ける必芁がありたす。


さたざたな理由から、接頭蟞await反察しおいるので、ブロックはawait { ... }たす。

たず、 await expr?に優先順䜍の問題があり、䞀貫した優先順䜍は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()
    };

これは人間工孊的ではなく、関数の垂盎方向の長さを倧幅に膚らたせたす。


代わりに、 ? 、メ゜ッドチェヌンを䞭心ずするRust゚コシステムに適合するため、埅機する必芁がありたす。 いく぀かの埌眮構文が蚀及されおいたす。 それらのいく぀かを芋おいきたす

  1. foo.await!() -これは接尟蟞マクロ゜リュヌションです。 私はpostfixマクロを匷く支持しおいたすが、 https //github.com/rust-lang/rust/issues/50547#issuecomment -454225040の@cramertjに同意したす。これは、postfixもコミットしない限り実行しないで

  2. foo await -これはそれほど悪くはありたせん。実際には接尟蟞挔算子 expr op のように機胜したすが、このフォヌマットには䜕かが欠けおいるように感じたす぀たり、「空」ず感じたす。 察照的に、 expr? ?をexpr盎接アタッチしたす。 ここにはスペヌスがありたせん。 これにより、 ?は芖芚的に魅力的に芋えたす。

  3. foo.await -これはフィヌルドアクセスのように芋えるず批刀されおいたす。 そしおそれは本圓です。 ただし、 awaitはキヌワヌドであるため、そのように匷調衚瀺された構文になるこずを芚えおおく必芁がありたす。 IDEたたは同等のGitHubでRustコヌドを読み取る堎合、 awaitはfooずは異なる色たたは倪字になりたす。 別のキヌワヌドを䜿甚しお、これを瀺すこずができたす。

    let x = foo.match?;
    

    通垞、フィヌルドも名詞ですが、 awaitは動詞です。

    foo.awaitに぀いおは最初の嘲笑の芁玠がありたすが、芖芚的に魅力的でありながら読みやすい構文ずしお、真剣に怜蚎する必芁があるず思いたす。

    ボヌナスずしお、 .awaitを䜿甚するず、ドットのパワヌず、 IDEでドットが通垞持぀オヌトコンプリヌトが埗られたす56ペヌゞを参照。 たずえば、 foo.ず曞くこずができ、 fooが将来の堎合、 awaitが最初の遞択肢ずしお衚瀺されたす。 ドットに到達するこずは倚くの開発者が筋肉の蚘憶に蚓緎したものであるため、これは人間工孊ず開発者の生産性の䞡方を促進したす。

    考えられるすべおの接尟蟞の構文では、フィヌルドアクセスのように芋えるこずに぀いおの批刀にもかかわらず、これは私のお気に入りの構文のたたです。

  4. foo# -これは、印章#を䜿甚しおfooを埅機したす。 ?も印章であり、軜量になるので、印章を怜蚎するのは良い考えだず思いたす。 ?ず組み合わせるず、 foo#?ようになりたす。これで問題ありたせん。 ただし、 #は具䜓的な理由はありたせん。 むしろ、それはただ利甚可胜な単なる印章です。

  5. foo@ -別の印章は@です。 ?ず組み合わせるず、 foo@?たす。 この特定の印章の正圓化の1぀は、 a -ish @wait に芋えるこずです。

  6. foo! -最埌に、 !たす。 ?ず組み合わせるず、 foo!?たす。 残念ながら、これには特定のWTF感がありたす。 ただし、 !は、「埅機」に適合する倀を匷制するように芋えたす。 foo!()すでに正圓なマクロ呌び出しであるずいう欠点がありたす。そのため、関数の埅機ず呌び出しは(foo)!()ず蚘述する必芁がありたす。 構文ずしおfoo!を䜿甚するず、キヌワヌドマクロ䟋 foo! expr を持぀機䌚も奪われたす。

もう1぀の印章はfoo~です。 波は「゚コヌ」たたは「時間がかかる」ず理解できたす。 それでも、Rust蚀語のどこでも䜿甚されおいたせん。

チルダ~は、昔はヒヌプ割り圓おタむプに䜿甚されおいたした https 

?は再利甚できたすか それずも魔法が倚すぎたすか impl Try for T: Futureどのようになりたすか

@parasyteはい、芚えおいたす。 しかし、それでもそれはずっず消えおいたした。

@jethrogb impl Try盎接機胜しおいるこずを確認する方法はありたせん。 ?明瀺的にreturn Tryは、珟圚の関数からのawaitはyield awaitする必芁がありたす。

たぶん?は、ゞェネレヌタヌのコンテキストで䜕か他のこずをするために特別な堎合があり、適甚される匏のタむプに応じおyieldたたはreturnかになりたす。 、しかしそれがどれほど理解できるかはわかりたせん。 たた、どのようにしおその盞互䜜甚するFuture<Output=Result<...>> 、あなたがしなければならないlet foo = bar()??;の䞡方にない"のawait"ずし、取埗OkのバリアントをResult たたは、ゞェネレヌタヌの?は、 yield 、 returnたたは単䞀のアプリケヌションで倀に解決できるトラむステヌト特性に基づいおいたすか

その最埌の括匧で囲たれた発蚀は、実際にそれが実行可胜である可胜性があるず私に思わせたす。クリックしお簡単なスケッチを芋おください
enum GenOp<T, U, E> { Break(T), Yield(U), Error(E) }

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

    fn into_result(self) -> GenOp<Self::Ok, Self::Yield, Self::Error>;
}
ゞェネレヌタヌ内の `foo`が次のように拡匵されたすただし、これには所有暩の問題があり、 `foo`の結果をスタックピンする必芁がありたす
loop {
    match TryGen::into_result(foo) {
        GenOp::Break(val) => break val,
        GenOp::Yield(val) => yield val,
        GenOp::Return(val) => return Try::from_error(val.into()),
    }
}

残念ながら、このようなスキヌムでwakerコンテキスト倉数を凊理する方法がわかりたせん。おそらく、 ?がゞェネレヌタヌではなくasync特別な堎合ですが、特別なものになる堎合は-ここでのケヌスでは、他のゞェネレヌタヌのナヌスケヌスで䜿甚できるず䟿利です。

?再利甚に぀いおは@jethrogbず同じ考えでした。

@ Nemo157

impl Try盎接機胜しおいるこずを確認する方法はありたせん。 ?明瀺的にreturn s珟圚の関数からのTryの結果であり、埅機はyield必芁がありたす。

おそらく、 ?ずTry特性に関する詳现が欠けおいたすが、それはどこで/なぜ明瀺されおいるのでしょうか。 そしお、非同期クロヌゞャのreturnは、ずにかくyieldず本質的に同じではなく、ただ異なる状態遷移ですか

たぶん?は、ゞェネレヌタヌのコンテキストで䜕か他のこずをするために特別な堎合があり、適甚される匏のタむプに応じおyieldたたはreturnかになりたす。 、しかしそれがどれほど理解できるかはわかりたせん。

なぜそれが混乱するのかわかりたせん。 ?を「継続たたは分岐」ず考えるず、圓然のように思えたす、私芋。 確かに、関連付けられたリタヌンタむプに異なる名前を䜿甚するようにTryトレむトを倉曎するず圹立ちたす。

たた、それはFuture<Output=Result<...>>ずどのように盞互䜜甚したすか、 let foo = bar()??たす;

結果を埅ち、゚ラヌ結果を早期に終了したい堎合は、それが論理匏になりたす。 特別なトラむステヌトTryGenはたったく必芁ないず思いたす。

残念ながら、このようなスキヌムでwakerコンテキスト倉数を凊理する方法がわかりたせん。 ゞェネレヌタヌではなく非同期甚に特別にケヌス化されおいたしたが、ここで特別なケヌスになる堎合は、他のゞェネレヌタヌのナヌスケヌスで䜿甚できるず䟿利です。

この郚分がわかりたせん。 詳现を教えおいただけたすか

@jethrogb @rolandsteiner構造䜓は、 TryずFuture䞡方を実装できたす。 この堎合、どちらを?アンラップする必芁がありたすか

@jethrogb @rolandsteiner構造䜓は、TryずFutureの䞡方を実装できたす。 この堎合、どちらをすべきですか アンラップ

いいえ、それはブランケットimplのせいでできたせんでした。TryforTFuture。

明瀺的な構築ず暗黙的な埅機の提案に぀いお誰も話しおいないのはなぜですか これはsyncioず同じですが、スレッドではなくタスクをブロックしおいるだけです。 スレッドのブロックはタスクのブロックよりも䟵襲的であるずさえ蚀えたすが、なぜthread-blocking-ioに特別な「await」構文がないのでしょうか。

しかし、それはすべお自転車のシェヌディングです。少なくずも今のずころ、単玔なマクロ構文await!(my_future)で解決する必芁があるず思いたす。

しかし、それはすべお自転車のシェヌディングです。少なくずも今のずころ、単玔なマクロ構文await!(my_future)で解決する必芁があるず思いたす。

いいえ、それはあたかもそれが平凡で取るに足らないものであるかのように「ただの」自転車の脱萜ではありたせん。 awaitがプレフィックスずポストフィックスのどちらで蚘述されるかは、非同期コヌドの蚘述方法に基本的に圱響したす。 メ゜ッドの連鎖ずそれがどのように構成可胜であるか。 await!(future)安定させるには、キヌワヌドずしおのawaitを攟棄する必芁があり、将来的にawaitをキヌワヌドずしお䜿甚するこずは䞍可胜になりたす。 「少なくずも今のずころ」は、埌でより良い構文を芋぀けるこずができ、これに䌎う技術的負債を無芖するこずを瀺唆しおいたす。 私は、埌で眮き換えられるこずを意図した構文に故意に借金を導入するこずに反察しおいたす。

たた、awaitfutureでの安定化には、キヌワヌドずしおのawaitが攟棄されるため、キヌワヌドずしおのawaitの将来の䜿甚が䞍可胜になりたす。

try堎合ず同じように、次の゚ポックでそれをキヌワヌドにしお、マクロの生のident構文を芁求するこずができたす。

@rolandsteiner

そしお、非同期クロヌゞャのreturnは、ずにかくyieldず本質的に同じではなく、ただ異なる状態遷移ですか

yieldは非同期クロヌゞャには存圚したせん。これは、 async / await構文からゞェネレヌタヌ/ yieldロヌむング䞭に導入された操䜜です。 珟圚のゞェネレヌタヌ構文では、 yieldはreturnずはかなり異なりたす。ゞェネレヌタヌ倉換の前に?展開が行われるず、い぀挿入するかがわかりたせん。 returnたたはyield 。

結果を埅ちたい堎合、nalsoが゚ラヌ結果の早い段階で終了する堎合は、それが論理匏になりたす。

論理的かもしれたせんが、非同期関数を蚘述しおいる倚くのほずんどのケヌスがIO゚ラヌに察凊するために2倍の??で満たされるこずは私には欠点のようです。

残念ながら、りェむカヌコンテキスト倉数を凊理する方法がわかりたせん...

この郚分がわかりたせん。 詳现を教えおいただけたすか

非同期倉換は、生成されたFuture::poll関数でwaker倉数を受け取りたす。次に、これを倉換されたawait操䜜に枡す必芁がありたす。 珟圚、これは䞡方の倉換が参照するstdによっお提䟛されるTLS倉数で凊理されたす。代わりに、 ?が_ゞェネレヌタヌレベルで_再生成ポむントずしお凊理された堎合、非同期倉換は途䞭で倱われたす。この倉数参照を挿入したす。

2か月前の私の奜みを抂説したawait構文に぀いおのブログ投皿を曞きたし

  • 私の䞀般的な意芋は、Rustはすでにその䞍慣れな予算を本圓に䌞ばしおいるずいうこずです。 サヌフェスレベルのasync / await構文は、JavaScript、Python、たたはCからのナヌザヌにできるだけ銎染みがあるこずが理想的です。 この芳点からは、暙準からわずかな方法でのみ分岐するこずが理想的です。 接頭蟞の構文は、発散の皋床によっお異なりたすたずえば、 foo awaitは、 foo@ようないく぀かの印章よりも発散が少ないが、接頭蟞が埅぀よりもすべお発散しおいたす。
  • たた、 !䜿甚しない構文を安定させるこずも奜みたす。 async / awaitを扱うすべおのナヌザヌは、なぜawaitが通垞の制埡フロヌ構造ではなくマクロであるのか疑問に思うでしょう。ここでの話は本質的に「良い構文を理解できなかったので、萜ち着いた」ず思いたす。マクロのように芋せたす。」 これは説埗力のある答えではありたせん。 !ず制埡フロヌの関連付けは、この構文を正圓化するのに十分ではないず思いたす。 !は、かなり具䜓的にはマクロの拡匵を意味するず思いたすが、そうではありたせん。
  • 私は䞀般的にpostfixawaitの利点に぀いお少し疑わしいです完党ではなく、ただの皮類です。 埅機はよりコストのかかる操䜜であるため、バランスは?ずは少し異なるず思いたす分岐しお1回戻るだけでなく、準備ができるたでルヌプで譲りたす。 私は、1぀の匏で2〜3回埅機するコヌドに疑いを持っおいたす。 これらを独自のletバむンディングに匕き出す必芁があるず蚀っおも問題ないようです。 したがっお、 try!ず?トレヌドオフは、ここではそれほど匷くはありたせん。 しかしたた、私は人々が実際にレットに匕き出されるべきではないず考えおいるコヌドサンプルを受け入れ、メ゜ッドチェヌンずしおより明確になりたす。

そうは蚀っおも、 foo awaitは、これたでに芋た䞭で最も実行可胜な埌眮構文です。

  • 埌眮構文に぀いおは比范的よく知られおいたす。 あなたが孊ばなければならないのは、awaitは、倧幅に異なる構文ではなく、Rustの匏の前ではなく、匏の埌にあるずいうこずです。
  • これにより、これたでの優先順䜍の問題が明確に解決されたす。
  • メ゜ッドチェヌンでうたく機胜しないずいう事実は、以前に觊れた理由から、デメリットではなく、ほずんどメリットのように思えたす。 fooではなくawaitにメ゜ッドが無意味に適甚されおいるず本圓に感じおいるずいう理由だけで、 foo await.method()を防ぐ文法芏則があれば、もっずやむを埗ないかもしれたせん興味深いこずに foo await?ではそうは思わない。

私はただプレフィックス構文に傟倒しおいたすが、 awaitは、私にずっお本物のショットを持っおいるように感じる最初のポストフィックス構文だず思いたす。

補足優先順䜍を明確にするために括匧を䜿甚するこずは垞に可胜です

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

これは必ずしも理想的ではありたせんが、1行にたくさん詰め蟌もうずしおいるこずを考えるず、合理的だず思いたす。

そしお、 @ earthengineが前に述べたように、耇数行バヌゞョンは非垞に合理的です䜙分な括匧はありたせん

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!()はファヌストクラスに十分に芋えたせん。

  • 私は䞀般的にpostfixawaitの利点に疑問を持っおいたす完党にではなく、_sort of_だけです。 埅機はよりコストのかかる操䜜であるため、バランスは?ずは少し異なるず思いたす分岐しお1回戻るだけでなく、準備ができるたでルヌプで譲りたす。

letバむンディングに物事を抜出するこずず費甚がどのように関係しおいるかわかりたせん。 メ゜ッドチェヌンは高額になる可胜性があり、堎合によっおは高額になるこずもありたす。 letバむンディングの利点は、a読みやすさを向䞊させるのに意味のある名前を十分に倧きい郚分に付けるこず、b同じ蚈算倀を耇数回参照できるこずたずえば、 &xたたはタむプがコピヌ可胜な堎合。

私は、1぀の匏で2〜3回埅機するコヌドに疑いを持っおいたす。 これらを独自のletバむンディングに匕き出す必芁があるず蚀っおも問題ないようです。

それらが独自のletバむンディングに匕き出されるべきだず感じた堎合でも、postfix await䜿甚しおその遞択を行うこずができたす。

let temporary = some_computation() await?;

メ゜ッドチェヌンに同意せず、奜む人のために、接尟蟞await遞択できたす。 たた、postfixは、ここでは巊から右ぞの読み取りずデヌタフロヌの順序に埓う方が適切だず思いたす。したがっお、 letバむンディングに抜出する堎合でも、postfixを䜿甚するこずをお勧めしたす。

たた、postfix awaitが圹立぀ようになるたで、2、3回埅぀必芁はないず思いたす。 たずえば、これはrustfmtの結果ですを考えおみたしょう。

    let foo = alpha()
        .beta
        .some_other_stuff()
        .await?
        .even_more_stuff()
        .stuff_and_stuff();

しかしたた、私は人々が実際にレットに匕き出されるべきではないず考えおいるコヌドサンプルを受け入れ、メ゜ッドチェヌンずしおより明確になりたす。

私が読んだフクシアコヌドのほずんどは、 letバむンディングに抜出され、 let binding = await!(...)?;ず、䞍自然に感じられたした。

  • 埌眮構文に぀いおは比范的よく知られおいたす。 あなたが孊ばなければならないのは、awaitは、倧幅に異なる構文ではなく、Rustの匏の前ではなく、匏の埌にあるずいうこずです。

ここでのfoo.await奜みは、䞻に、優れたオヌトコンプリヌトずドットのパワヌが埗られるためです。 それほど根本的な違いも感じたせん。 foo.await.method()曞くず、 .method()がfoo.await適甚されるこずも明確になりたす。 したがっお、それはその懞念を解決したす。

  • これにより、これたでの優先順䜍の問題が明確に解決されたす。

いいえ、それは優先順䜍だけではありたせん。 メ゜ッドチェヌンも同様に重芁です。

  • メ゜ッドチェヌンでうたく機胜しないずいう事実は、以前に觊れた理由から、デメリットではなく、ほずんどメリットのように思えたす。

メ゜ッドチェヌンでうたく機胜しない理由がわかりたせん。

fooではなくawaitにメ゜ッドが無意味に適甚されおいるず本圓に感じおいるずいう理由だけで、 foo await.method()を防ぐ文法芏則があれば、もっずやむを埗ないかもしれたせん興味深いこずに foo await?ではそうは思わない。

䞀方、意図的なデザむンペヌパヌカットを導入し、接尟蟞await構文を䜿甚しおメ゜ッドの連鎖を防止した堎合、 foo await必芁はありたせん。

すべおのオプションに欠点があり、それでもそのうちの1぀が遞択されるこずを認める... foo.awaitに぀いお私を悩たせおいるこずの1぀は、文字通り誀解されないず仮定しおも、それです。構造䜓フィヌルドでも、構造䜓フィヌルドにアクセスしおいるように芋えたす。 フィヌルドアクセスの意味は、特に圱響のあるものは䜕も起こっおいないずいうこずです。これは、Rustで最も効果の䜎い操䜜の1぀です。 䞀方埅っおは、ほずんど副䜜甚のいずれかの操䜜性の高いむンパクトであるそれはI / O操䜜は、将来的に構築し、制埡フロヌ効果を有するの䞡方を行いたす。 したがっお、 foo.await.method()を読んだずき、脳は.awaitをスキップするように蚀っおいたす。これは比范的面癜くないので、泚意ず努力を払っおその本胜を手動で無効にする必芁がありたす。

それでも、構造䜓フィヌルドにアクセスしおいるように芋えたす。

@glaebhoerlあなたは良い点を䜜りたす。 しかし、構文の匷調衚瀺は、それがどのように芋えるか、そしおあなたの脳が物事を凊理する方法に圱響を䞎えない/䞍十分ですか 少なくずも私にずっおは、コヌドを読むずきに色ず倧胆さが非垞に重芁なので、他のものずは異なる色の.awaitをスキップするこずはありたせん。

フィヌルドアクセスの意味は、特に圱響のあるものは䜕も起こっおいないずいうこずです。これは、Rustで最も効果の䜎い操䜜の1぀です。 䞀方、埅機は非垞に圱響力があり、最も副䜜甚のある操䜜の1぀です将来構築されるI / O操䜜を実行し、制埡フロヌ効果がありたす。

私はこれに匷く同意したす。 awaitは、 breakやreturnような制埡フロヌ操䜜であり、明瀺的である必芁がありたす。 提案された接尟蟞衚蚘は、Pythonのifのように䞍自然に感じたす if c { e1 } else { e2 }をe1 if c else e2ず比范しおください。 最埌に挔算子が衚瀺されるず、構文の匷調衚瀺に関係なく、ダブルテむクを実行できたす。

たた、 e.awaitがawait!(e)やawait eよりもRust構文ずどのように䞀臎しおいるかわかりたせん。 他にpostfixキヌワヌドはありたせん。たた、そのアむデアの1぀はパヌサヌで特殊なケヌスにするこずだったので、それが䞀貫性のある蚌拠ではないず思いたす。

@withoutboatsが蚀及した芪しみやすさの問題もありたす。 いく぀かの玠晎らしい利点がある堎合は、奇劙で玠晎らしい構文を遞択できたす。 しかし、接尟蟞awaitはそれらがありたすか

構文の匷調衚瀺は、それがどのように芋えるか、そしおあなたの脳が物事を凊理する方法に圱響を䞎えない/䞍十分ですか

良い質問ですが、ある皋床の圱響があるず思いたすが、実際に詊しおみないず、どれだけ掚枬するのは難しいですそしお、別のキヌワヌドに眮き換えるこずは、これたでのずころしか埗られたせん。私が蚀及した前に私は、構文の匷調衚瀺は、制埡フロヌ効果を持぀すべおの挔算子をハむラむトすべきだず思うこずをreturn 、 break 、 continue 、 ?今...ずawait 特別な特別な色で衚瀺されたすが、私は構文の匷調衚瀺を担圓しおおらず、誰かが実際にこれを行っおいるかどうかはわかりたせん。

私はこれに匷く同意したす。 awaitは、 breakやreturnような制埡フロヌ操䜜であり、明瀺的である必芁がありたす。

賛成です。 衚蚘foo.await 、 foo await 、 foo# 、...は明瀺的です。 暗黙の埅機はありたせん。

たた、 e.awaitがawait!(e)やawait eよりもRust構文ずどのように䞀臎しおいるかわかりたせん。

構文e.await自䜓はRust構文ず䞀臎しおいたせんが、postfixは䞀般的に?ずRust APIの構造によく適合したすメ゜ッドは無料の関数よりも優先されたす。

await e?構文は、 (await e)?ずしお関連付けられおいる堎合、 breakずreturn関連付け方法ず完党に矛盟しおいたす。 await!(e)も䞀貫性がありたせん。これは、制埡フロヌ甚のマクロがなく、他のプレフィックスメ゜ッドず同じ問題があるためです。

他にpostfixキヌワヌドはありたせん。たた、そのアむデアの1぀はパヌサヌで特殊なケヌスにするこずだったので、それが䞀貫性のある蚌拠ではないず思いたす。

すでにフィヌルド操䜜ずしお凊理されおいるはずなので、実際にlibsyntaxを.awaitに倉曎する必芁はないず思いたす。 ロゞックは、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のメ゜ッド呌び出しの奜みが原因であるず䞻匵したす。

たた、プレフィックス制埡フロヌ挔算子のより目立぀蚭定もありたす。

埅っおたすか 構文、eを埅぀ずしお関連付けられおいる堎合 ブレヌクアンドリタヌンア゜シ゚ヌトの方法ず完党に矛盟しおいたす。

私はawait!(e)? 、 await { e }?あるいはおそらく{ await e }?を奜みたす-埌者が議論されおいるのを芋たこずがないず思いたす、そしおそれがうたくいくかどうかはわかりたせん。


私は巊から右ぞのバむアスがあるかもしれないこずを認めたす。 _ノヌト_

これに぀いおの私の意芋は、悪魔の代匁者を自分自身に挔じおいるかのように、問題を芋るたびに倉わるようです。 その䞀郚は、私が自分の先物やステヌトマシンを曞くこずに慣れおいるからです。 pollのカスタムフュヌチャヌは完党に正垞です。

おそらく、これは別の方法で考える必芁がありたす。

私にずっお、Rustのれロコストの抜象化ずは、実行時のれロコストず、より重芁な粟神的なれロコストの2぀を指したす。

先物を含むRustのほずんどの抜象化に぀いおは、単なるステヌトマシンであるため、非垞に簡単に掚論できたす。

この目的のために、ナヌザヌにほずんど魔法を導入しない単玔な解決策が存圚する必芁がありたす。 圌らは䞍必芁に魔法を感じるので、印章は特に悪い考えです。 これには、 .await魔法のフィヌルドが含たれたす。

おそらく最良の解決策は、最も簡単なもの、元のawait!マクロです。

したがっお、これらの他の蚀語に敬意を衚しお、Rustの内郚敎合性はより重芁であるように思われ、プレフィックス構文は優先順䜍たたはAPIの構造のいずれの点でもRustに適合するずは思いたせん。

どうしおいいのかわからない  await(foo)? / await { foo }?は、挔算子の優先順䜍ずRustでのAPIの構造の点で完党に問題ないようです。その欠点は、括匧の冗長性ず芖点によっおは連鎖であり、前䟋を壊したり、玛らわしい。

try! これはその目的をかなりうたく果たしたしたずおそらく非掚奚のselect!たす。

ここでの有効な単語は非掚奚だず思いたす。 䜿甚しおtry!(...)錆2018幎にハヌド゚ラヌである私たちはより良い、ファヌストクラス、および接尟蟞の構文を導入しおいるため今はハヌド゚ラヌです。

awaitはreturnよりも「匷力」であるため、コヌドで?のreturnよりも衚瀺されるこずを期埅するのは䞍合理ではありたせん。

?挔算子も同様に Result以倖の実装を通じお副䜜甚があり、制埡フロヌを実行するため、非垞に「匷力」です。 それが議論されたずき、 ?は「リタヌンを隠しおいる」ず芋萜ずされやすいず非難されたした。 予枬は完党に実珟できなかったず思いたす。 状況再。 awaitは私ずよく䌌おいるようです。

たた、プレフィックス制埡フロヌ挔算子のより目立぀蚭定もありたす。

これらのプレフィックス制埡フロヌ挔算子は、 !タむプで入力されたす。 䞀方、コンテキストimpl Try<Ok = T, ...>を受け取り、 ? Tは埌眮です。

どうしおいいのかわからない  await(foo)? / await { foo }?は、挔算子の優先順䜍ずRustでのAPIの構造の点でたったく問題ないようです-

await(foo)構文は、前者に括匧が必芁で埌者に括匧が必芁な堎合、 await fooず同じではありたせん。 前者は前䟋のないものであり、埌者には優先順䜍の問題がありたす。 ?ここで、ボヌトのブログ投皿、およびDiscordで説明したした。 await { foo }構文は、他の理由で問題がありたすhttps://github.com/rust-lang/rust/issues/50547#issuecomment-454313611を参照。

その欠点は、前䟋を壊したり混乱させたりしない、括匧ずあなたの芖点に応じお連鎖の蚀葉遣いです。

これが「APIは構造化されおいる」ずいう意味です。 Rustでは、メ゜ッドずメ゜ッドチェヌンが䞀般的で慣甚的だず思いたす。 プレフィックスずブロックの構文は、それらず?うたく構成されおいたせん。

私はこの意芋で少数掟かもしれたせん、もしそうなら、私を無芖しおください

prefix-vs-postfixのディスカッションを内郚スレッドに移動しおから、結果をここに戻すのは公平でしょうか そうすれば、远跡の問題を維持しお機胜のステヌタスを

@seanmonstarええ、私は远跡の問題に関する議論を制限したいずいう願望に匷く共感し、実際には単なるステヌタスの曎新である問題を抱えおいたす。 これは、RFCプロセスず䞀般的な問題の管理方法のいく぀かの改蚂で取り組むこずができるず私が望んでいる問題の1぀です。 今のずころ、私はここで新しい問題を開いお、議論に䜿甚できるようにしたした。

すべおにずっお重芁さらにawait構文の議論はここに行くべき

await構文に関する今埌の議論が適切な問題で行われるように、䞀時的に1日ロックしたす。

2019幎1月15日火曜日、07103​​2AM -0800に、Pauanは次のように曞いおいたす。

補足優先順䜍を明確にするために括匧を䜿甚するこずは垞に可胜です

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

これは、postfixawaitの䞻な利点を打ち負かしたす。
曞き蟌み/読み取り」。postfix ?ように、postfix awaitは、制埡フロヌを蚱可したす。
巊から右に移動し続けるには

foo().await!()?.bar().await!()

await!がプレフィックスだった堎合、たたはtry!がプレフィックスだった堎合、たたは
括匧で囲むには、の巊偎に戻る必芁がありたす
曞き蟌みたたは読み取り時の匏。

線集私は電子メヌルで最初から最埌たでコメントを読んでいたしたが、このメヌルを送信するたで「䌚話を他の問題に移動する」コメントは衚瀺されたせんでした。

リンクの曎新 https  https://github.com/rust-lang/rust/issues/53447が閉じられたようです。 https://github.com/rust-lang-nursery/futures-rs/issues/1199はhttps://github.com/rust-lang/rust/issues/53548に移動されたようです。

Async-awaitステヌタスレポヌト

http://smallcultfollowing.com/babysteps/blog/2019/03/01/async-await-status-report/


async-awaitのステヌタスに関する簡単な曎新を投皿したかった
努力。 短いバヌゞョンは、私たちがホヌムストレッチにいるずいうこずです
ある皮の安定化がありたすが、いく぀かの重芁な点が残っおいたす
克服すべき質問。

実装ワヌキンググルヌプの発衚

このプッシュの䞀環ずしお、私たちは
async-await実装ワヌキンググルヌプ。 このワヌキンググルヌプ
async-awaitの取り組み党䜓の䞀郚ですが、
実装であり、コンパむラチヌムの䞀郚です。 あなたがしたい堎合
非同期を取埗するのに圹立ちたす-フィニッシュラむンを埅っおください、私たちは問題のリストを持っおいたす
私たちが間違いなく助けを求めおいるずころ続きを読む。

ご興味のある方は「営業時間」をご甚意しおおりたす。火曜日に予定されおいたす[コンパむラチヌムのカレンダヌ]を参照 -
[Zulip]に衚瀺できるので、理想的です。 しかし、そうでない堎合は、いずれかをポップむンするだけです
時間。

..。

std::future::Futureはい぀安定したすか async awaitを埅぀必芁がありたすか ずおも玠敵なデザむンだず思いたす。コヌドの移怍を始めたいず思いたす。 厩舎で䜿甚するシムはありたすか

@ryは、新しい远跡の問題を参照しおください //github.com/rust-lang/rust/issues/59113

async / awaitの別のコンパむラの問題 https 

たた、䞊郚の投皿のhttps://github.com/rust-lang-nursery/futures-rs/issues/1199が修正されたため、チェックオフできるこずにも泚意しお

HRLBず非同期クロヌゞャに問題があるようです //github.com/rust-lang/rust/issues/59337。 ただし、RFCを再スキミングしおも、非同期クロヌゞャが非同期関数ず同じ匕数ラむフタむムキャプチャの察象になるこずは実際には指定されおいたせん。

ええ、非同期クロヌゞャにはたくさんの問題があり、安定化の最初のラりンドに含めるべきではありたせん。 珟圚の動䜜はclosure + asyncブロックで゚ミュレヌトできたす。将来的には、返されたfutureからクロヌゞャヌのupvarsを参照できるバヌゞョンを確認したいず思いたす。

珟圚await!(fut)ではfutがUnpin必芁があるこずに気づきたした https 

それは期埅されおいたすか RFCに含たれおいないようです。

゚ラヌを䞎えるawait!はない@Ekleog 、 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あり、そこから倀を移動できるため、1぀のヒヌプの堎所で未来を䞀床ポヌリングしおから、ボックスから未来を移動しお新しいヒヌプの堎所に配眮し、ポヌリングするこずができたす。もう䞀床。

awaitは、将来を消費するため、 Box<dyn Future>を蚱可するために特別な堎合が必芁になる可胜性がありたす

たぶんIntoFuture特性はawait!で埩掻する必芁がありたすか Box<dyn Future>は、 Pin<Box<dyn Future>>倉換するこずでそれを実装できたす。

これがasync / awaitの次のバグです async fnの戻り型の型パラメヌタヌに関連付けられた型を䜿甚するず掚論が壊れたす //github.com/rust-lang/rust/問題/ 60414

トップポストのリストに60414を远加する可胜性があるこずに加えおただ䜿甚されおいるかどうかわからない-githubラベルを指す方が良いかもしれたせんか、「rust-lang /の解決策」ず思いたす。 IIRCのFuture特性が最近安定したため、rfcs2418」にチェックマヌクを付けるこずができたす。

私はRedditの投皿から来たばかりで、postfix構文はたったく奜きではないず蚀わざるを埗たせん。 そしお、Redditの倧倚数もそれを気に入らないようです。

私はむしろ曞く

let x = (await future)?

その奇劙な構文を受け入れるよりも。

チェヌンに関しおは、コヌドをリファクタリングしお、 awaitを超えないようにするこずができたす。

たた、将来のJavaScriptはこれを行うこずができたすスマヌトパむプラむン提案

const x = promise
  |> await #
  |> x => x.foo
  |> await #
  |> x => x.bar

プレフィックスawaitが実装されおいる堎合、それはawaitをチェヌンできないこずを意味したせん。

@KSXGitHubこれは実際にはこの議論の堎ではありたせんが、ロゞックはここに抂説されおおり、倚くの人々によっお䜕ヶ月にたすhttps://boats.gitlab.io/blog/post / await-decision /

@KSXGitHub私も、最終的な構文を嫌いたすが、それは広く、57640で議論されおきたhttps://internals.rust-lang.org/t/await-syntax-discussion-summary/ 、 HTTPS//internals.rust- lang.org/t/a-final-proposal-for-await-syntax/ 、および他のさたざたな堎所。 倚くの人々がそこで圌らの奜みを衚明したした、そしおあなたは䞻題に新しい議論をもたらしおいたせん。

ここで蚭蚈䞊の決定に぀いお議論しないでください。この明確な目的のためのスレッドがありたす

そこでコメントする予定がある堎合は、議論がすでにかなり行われおいるこずを芚えおおいおください。実質的な発蚀があるこずを確認し、スレッドで以前に発蚀されおいないこずを確認しおください。

@withoutboatsは、最終的な構文がすでに合意されおいるこずを理解しおいたす。おそらく、それを完了ずしおマヌクするずきですか 赀面

7月4日の次のベヌタカットに間に合うように安定させる意図はありたすか、それずもブロックバグを解決するには別のサむクルが必芁ですか A-async-awaitタグの䞋には未解決の問題がたくさんありたすが、どれだけが重芁かはわかりたせん。

ああ、それを無芖しお、私はちょうどたした。

こんにちは この機胜の安定したリリヌスを期埅する必芁があるのはい぀ですか そしお、それをナむトリヌビルドでどのように䜿甚できたすか

@MehrdadKhnzd https://github.com/rust-lang/rust/issues/62149には、リリヌス予定日などに関する情報が含たれおいたす

async fnによっお生成される先物にUnpinを自動的に実装する蚈画はありたすか

具䜓的には、生成されたFutureコヌド自䜓が原因で、Unpinが自動的に䜿甚できないのか、それずも参照を匕数ずしお䜿甚できるのか、疑問に思っおいたす。

@DoumanAsh非同期fnがyieldポむントでアクティブな自己参照を持たない堎合、生成されたFutureはおそらく

「_this_borrowのためにUnpinはない」ずいう非垞に圹立぀゚ラヌメッセヌゞず「代わりにこの未来をボックス化できる」ずいうヒントを䌎う必芁があるず思いたす。

63209の安定化PRは、「すべおのブロッカヌが閉じられたした」ず述べおいたす。 そしお8月20日に毎晩䞊陞したため、今週埌半にベヌタカットに向かいたした。 8月20日以降、いく぀かの新しいブロッキングの問題が報告されおいるこずは泚目に倀したすAsyncAwait-Blockingタグによっお远跡されたす。 これらのうちの2぀63710、64130は、実際には安定化を劚げない䟿利な機胜のように芋えたすが、他に3぀の問題64391、64433、64477に぀いお説明する䟡倀があるようです。 これらの埌者の3぀の問題は関連しおおり、それらはすべおAsyncAwait-Blocking問題63832に察凊するために䞊陞したPR64292が原因で発生したす。 PR64584は、問題の倧郚分に察凊するためにすでに着陞しおいたすが、3぀の問題は今のずころ未解決のたたです。

銀色の裏打ちは、3぀の深刻なオヌプンブロッカヌが、コンパむルする必芁があるコヌドに関係しおいるように芋えるが、珟圚はコンパむルされおいないこずです。 その意味で、async / awaitのベヌタ化ず最終的な安定化を劚げるこずなく、埌で土地の修正ず䞋䜍互換性がありたす。 しかし、私はその非同期を瀺唆するのに十分な懞念されるLANGチヌムから誰もがここでその䜕かを考えおいるかどうかを思ったんだけど/のawaitはそれが聞こえるかもしれ䞍快ずしお、迅速なリリヌススケゞュヌルの点である、別のサむクルのために毎晩に焌く必芁がありたす結局。

@bstrie 「AsyncAwait-Blocking」を再利甚しおいるのは、「高優先床」ずしおそれらを瀺すためのより良いラベルがないためです。実際にはブロックしおいたせん。 混乱を少なくするために、ラベル付けシステムをすぐに刷新する必芁がありたす、cc @ nikomatsakis。

...良くありたせん... async-awaitを期埅しお1.38を逃したした。 カりントされなかったいく぀かの「問題」のために、1.39を埅たなければなりたせん...

@earthengineそれは状況の公正な評䟡ではないず思いたす。 発生した問題はすべお真剣に取り組む䟡倀がありたす。 人々が実際にそれを䜿おうずしおこれらの問題に遭遇するのを埅぀だけで非同期に着陞するのは良くありたせん:)

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡