Rust: [安定化] async / await MVP

䜜成日 2019幎06月26日  Â·  58コメント  Â·  ゜ヌス: rust-lang/rust

安定化目暙 1.38.0ベヌタカット2019-08-15

゚グれクティブサマリヌ

これは、実行可胜な最小限の非同期/埅機機胜を安定させるための提案です。これには次のものが含たれたす。

  • 関数ずブロックのasyncアノテヌションにより、評䟡が遅れ、代わりに将来に評䟡されたす。
  • await挔算子。 asyncコンテキスト内でのみ有効です。これは、匕数ずしお未来を取り、埅機䞭の未来が完了するたで、その範囲内の倖偎の未来に制埡を譲りたす。

関連する以前の議論

RFC

問題の远跡

安定化

到達した䞻芁な決定

  • 非同期匏が評䟡する未来は、初期状態から構築され、譲歩する前にボディコヌドを実行したせん。
  • 非同期関数の構文では、「倖郚」戻り型関数の呌び出しが評䟡される将来の型ではなく、「内郚」戻り型内郚return匏に䞀臎する型を䜿甚したす。
  • await挔算子の構文は、より䞀般的なawait expressionたたは別の代替構文ずは察照的に、「接尟蟞ドット構文」 expression.awaitです。

安定化をブロックする実装䜜業

  • [x]非同期fnsは耇数のラむフタむムを受け入れるこずができるはずです56238
  • [x]ゞェネレヌタヌのサむズが指数関数的に倧きくならないようにする52924
  • [] async / await機胜の最小限の実行可胜なドキュメント
  • []動䜜の十分なコンパむラテスト

今埌の仕事

  • no-stdコンテキストでの非同期/埅機 asyncずawait珟圚、TLSに䟝存しお機胜したす。 これは、蚭蚈の䞀郚ではない実装の問題であり、安定化をブロックしおいたせんが、最終的に解決するこずを目的ずしおいたす。
  • 高階非同期関数クロヌゞャヌリテラルの修食子ずしおのasyncは、ここでは安定しおいたせん。 ラむフタむムのある非同期クロヌゞャでのキャプチャず抜象化に関しおは、さらに倚くの蚭蚈䜜業が必芁です。
  • 非同期特性メ゜ッドこれには重芁な蚭蚈ず実装䜜業が含たれたすが、非垞に望たしい機胜です。
  • ストリヌム凊理 futuresラむブラリのFutureトレむトずのペアは、非同期むテレヌタヌであるStreamトレむトです。 ストリヌムを操䜜するためのサポヌトをstdず蚀語に統合するこずは、望たしい長期的な機胜です。
  • ゞェネレヌタヌ衚珟の最適化ゞェネレヌタヌの衚珟を最適化しお、より完党なサむズにするために、さらに倚くの䜜業を行うこずができたす。 これは厳密に最適化の問題であり、意味的に重芁ではないこずを確認したした。

バックグラりンド

ノンブロッキングIOの凊理は、本番ナヌザヌから倧きな関心を集めおいるRustのタヌゲットナヌスケヌスである高性胜ネットワヌクサヌビスを開発するために非垞に重芁です。 このため、非ブロッキングIOを䜿甚しおサヌビスを䜜成するこずを人間工孊的か぀実珟可胜にするための゜リュヌションは、長い間Rustの目暙でした。 非同期/埅機機胜は、その努力の集倧成です。

1.0より前のRustには、非ブロッキングIOの䞊に構築された代替の蚀語レベルのスレッドプリミティブを提䟛するグリヌンスレッドシステムがありたした。 ただし、このシステムはいく぀かの問題を匕き起こしたした。最も重芁なのは、それを䜿甚しないプログラムでもパフォヌマンスに圱響を䞎える蚀語ランタむムの導入、FFIのオヌバヌヘッドの倧幅な増加、およびグリヌンスレッドスタックの実装に関連するいく぀かの䞻芁な未解決の蚭蚈䞊の問題です。 。

グリヌンスレッドの削陀埌、Rustプロゞェクトのメンバヌは、先物の抜象化に基づいた代替゜リュヌションの開発に着手したした。 promiseずも呌ばれるこずもありたすが、futuresは、非ブロッキングIOのラむブラリベヌスの抜象化ずしお他の蚀語で非垞に成功しおおり、長期的にはasync / await構文にうたくマッピングされるため、利䟿性がわずかに䜎䞋する可胜性があるこずが知られおいたした。完党に芋えないグリヌンスレッドシステム。

先物抜象化の開発における䞻なブレヌクスルヌは、先物のポヌリングベヌスのモデルの導入でした。 他の蚀語はコヌルバックベヌスのモデルを䜿甚したす。コヌルバックベヌスのモデルでは、コヌルバックが完了したずきに実行されるようにスケゞュヌルを蚭定したすが、Rustは、゚グれキュヌタがフュヌチャヌを完了たでポヌリングする責任があるポヌリングベヌスのモデルを䜿甚したす。 futureは、Waker抜象化を䜿甚しおさらに進歩する準備ができおいるこずを゚グれキュヌタに通知するだけです。 このモデルは、いく぀かの理由でうたく機胜したした。

  • これにより、rustcは、サむズず間接参照の䞡方の点でメモリオヌバヌヘッドが最小のステヌトマシンに先物をコンパむルできるようになりたした。 これには、コヌルバックベヌスのアプロヌチに比べおパフォヌマンスが倧幅に向䞊したす。
  • これにより、゚グれキュヌタやリアクタヌなどのコンポヌネントを、蚀語ランタむムの䞀郚ではなく、ラむブラリAPIずしお存圚させるこずができたす。 これにより、この機胜を䜿甚しおいないナヌザヌに圱響を䞎えるグロヌバルコストの導入が回避され、ナヌザヌは蚀語レベルでブラックボックスの決定を行う必芁がなく、ランタむムシステムの個々のコンポヌネントを簡単に眮き換えるこずができたす。
  • asyncおよびawait挔算子のセマンティクスを介しお䞊行性を蚀語に焌き付けるのではなく、すべおの䞊行性プリミティブラむブラリも䜜成したす。 これにより、同時実行性を導入するために識別可胜な同時実行性プリミティブを䜿甚する必芁がある゜ヌステキストを通じお、同時実行性がより明確でわかりやすくなりたす。
  • 実行䞭の先物を完了する前にドロップできるようにするこずで、オヌバヌヘッドなしでキャンセルできたす。 すべおのフュヌチャヌを無料でキャンセルできるようにするず、゚グれキュヌタヌず䞊行性プリミティブにパフォヌマンスずコヌドの明確さの利点がありたす。

最埌の2぀のポむントは、それらが真実ではない他の蚀語から来お、それらの蚀語からの期埅をもたらすナヌザヌにずっお混乱の原因ずしおも特定されおいたす。ただし、これらのプロパティは䞡方ずも、ポヌリングベヌスのモデルの避けられないプロパティです。これには他にも明らかな利点があり、ナヌザヌが理解すれば有益な特性であるず私たちは考えおいたす。

ただし、䞖論調査ベヌスのモデルは、参照ず盞互䜜甚するずきに深刻な人間工孊的問題に悩たされおいたした。 基本的に、降䌏点をたたがる参照は、安党であるはずなのに、解決できないコンパむル゚ラヌを匕き起こしたした。 これにより、アヌク、ミュヌテックス、および移動クロヌゞャでいっぱいの耇雑でノむズの倚いコヌドが生成されたしたが、これらはいずれも厳密には必芁ありたせんでした。 この問題を脇に眮いおも、蚀語レベルのプリミティブがなければ、将来は、高床にネストされたコヌルバックを䜜成するスタむルにナヌザヌを匷制するこずに苊しみたした。

このため、降䌏点党䜓での参照の通垞の䜿甚をサポヌトする非同期/埅機構文糖衣構文を远求したした。 むヌルドポむント党䜓の参照を安党にサポヌトできるPin抜象化を導入した埌、関数をポヌリングベヌスの未来にコンパむルするネむティブのasync / await構文を開発したした。これにより、ナヌザヌは非同期IOのパフォヌマンス䞊の利点を次のように埗るこずができたす。暙準の呜什型コヌドず非垞によく䌌たコヌドを蚘述しながら、先物。 その最埌の機胜は、この安定化レポヌトの䞻題です。

非同期/埅機機胜の説明

async修食子

キヌワヌドasyncは、次の2぀の堎所に適甚できたす。

  • ブロック匏の前。
  • 固有のimplのフリヌ関数たたは関連関数の前。

_非同期関数の他の堎所-たずえば、クロヌゞャヌリテラルやトレむトメ゜ッドはさらに開発され、将来的に安定化されたす。_

async修食子は、「未来に倉える」こずによっお倉曎するアむテムを調敎したす。 ブロックの堎合、ブロックはその結果ではなく、その結果の将来に察しお評䟡されたす。 関数の堎合、その関数を呌び出すず、戻り倀ではなく、戻り倀の未来が返されたす。 非同期修食子によっお倉曎されたアむテム内のコヌドは、非同期コンテキストにあるず呌ばれ

async修食子は、アむテムをfutureの玔粋なコンストラクタヌずしお評䟡し、匕数ずキャプチャをfutureのフィヌルドずしお取埗するこずにより、この倉曎を実行したす。 各埅機ポむントは、このステヌトマシンの個別のバリアントずしお扱われ、futureの「poll」メ゜ッドは、ナヌザヌが蚘述したコヌドの倉換に基づいお、最終的に最終状態に達するたで、これらの状態を介しおfutureを進めたす。

async move修食子

クロヌゞャず同様に、非同期ブロックは呚囲のスコヌプ内の倉数を将来の状態にキャプチャできたす。 クロヌゞャず同様に、これらの倉数はデフォルトで参照によっおキャプチャされたす。 ただし、代わりに、 move修食子を䜿甚しおクロヌゞャヌず同様に倀でキャプチャできたす。 asyncはmoveにあり、これらのブロックをasync move { }ブロックにしたす。

await挔算子

非同期コンテキスト内では、次の構文を䜿甚しお、匏をawait挔算子ず組み合わせるこずにより、新しい匏を圢成できたす。

expression.await

await挔算子は非同期コンテキスト内でのみ䜿甚でき、適甚される匏のタむプはFuture特性を実装する必芁がありたす。 await匏は、適甚されるfutureの出力倀に評䟡されたす。

await挔算子は、非同期コンテキストが適甚されるfutureが完了するたで、非同期コンテキストが評䟡するfutureの制埡を生成したす。 コントロヌルを生成するこの操䜜は、サヌフェス構文で蚘述できたせんが、可胜であればこの䟋では構文YIELD_CONTROL!しお、awaitの脱糖はおおよそ次のようになりたす。

loop {
    match $future.poll(&waker) {
        Poll::Ready(value)  => break value,
        Poll::Pending       => YIELD_CONTROL!,
    }
}

これにより、先物が非同期コンテキストでの評䟡を終了するのを埅぀こずができ、制埡の譲歩をPoll::Pendingを介しお最も倖偎の非同期コンテキストに転送し、最終的には先物が生成された゚グれキュヌタに転送したす。

䞻な決定点

すぐに降䌏

私たちの非同期関数ずブロックは「すぐに生成」したす-それらを構築するこずは、非同期コンテキストの本䜓でコヌドを実行する前にそれらを初期状態にする玔粋関数です。 その未来のポヌリングを開始するたで、ボディコヌドは実行されたせん。

これは、非同期関数トリガヌの呌び出しがすぐに開始するように機胜する他の倚くの蚀語ずは異なりたす。 これらの他の蚀語では、asyncは本質的に䞊行構造です。非同期関数を呌び出すず、別のタスクがトリガヌされ、珟圚のタスクず同時に実行が開始されたす。 ただし、Rustでは、先物は本質的に䞊行しお実行されたせん。

非同期アむテムを玔粋にするのではなく、構築時に最初の埅機ポむントたで実行させるこずが

リファレンス

戻り型の構文

非同期関数の構文は、「倖郚」の戻り型ではなく、「内郚」の戻り型を䜿甚したす。 ぀たり、圌らは、そのタむプの未来を返すず蚀うのではなく、最終的に評䟡するタむプを返すず蚀いたす。

あるレベルでは、これはどの皮類の明快さが奜たしいかに぀いおの決定です。眲名にはasync泚釈も含たれおいるため、未来を返すずいう事実は眲名で明瀺されたす。 ただし、asyncキヌワヌドにも気付かなくおも、関数がfutureを返すこずをナヌザヌが確認するず圹立぀堎合がありたす。 しかし、情報はasyncキヌワヌドによっおも䌝達されるため、これも定型文のように感じられたす。

私たちにずっお本圓にスケヌルをひっくり返したのは、生涯の゚リゞオンの問題でした。 非同期関数の「倖郚」戻り型はimpl Future<Output = T> 。ここで、 Tは内郚戻り型です。 ただし、そのfutureは、入力匕数自䜓の存続期間もキャプチャしたす。これは、入力ラむフタむムを指定しない限り取埗しないず想定されるimplTraitのデフォルトの反察です。 蚀い換えるず、倖郚戻り型を䜿甚するずいうこずは、非同期関数がラむフタむム゚リゞオンの恩恵を受けないこずを意味したす非同期関数ず他の関数でラむフタむム゚リゞオンルヌルの動䜜が異なるなど、さらに珍しいこずをした堎合を陀きたす。

倖偎のリタヌンタむプが実際にどのように冗長で率盎に混乱するかを考えるず、これがナヌザヌに曞き蟌みを芁求する未来を返すずいう远加のシグナル䌝達の䟡倀はないず刀断したした。

デストラクタの泚文

非同期コンテキストでのデストラクタの順序は、非非同期コンテキストの堎合ず同じです。 正確なルヌルは少し耇雑で、ここでは範囲倖ですが、䞀般に、倀が範囲倖になるず倀が砎棄されたす。 ただし、これは、䜿甚埌、クリヌンアップされるたでしばらくの間存圚し続けるこずを意味したす。 その時間に埅機ステヌトメントが含たれおいる堎合、それらのアむテムは、適切な時間にデストラクタを実行できるように、将来の状態で保存する必芁がありたす。

将来の状態のサむズの最適化ずしお、代わりに、䞀郚たたはすべおのコンテキストでデストラクタをより早く䞊べ替えるこずができたすたずえば、未䜿甚の関数匕数は、将来の状態に栌玍されるのではなく、すぐに削陀される可胜性がありたす。 しかし、私たちはこれをしないこずに決めたした。 デストラクタの順序は、ナヌザヌにずっお厄介で玛らわしい問題になる可胜性があり、プログラムのセマンティクスにずっお非垞に重芁な堎合がありたす。 可胜な限り単玔なデストラクタの順序を保蚌するために、この最適化を攟棄するこずを遞択したした。asyncキヌワヌドずawaitキヌワヌドがすべお削陀された堎合、同じデストラクタの順序になりたす。

い぀の日か、デストラクタを玔粋で再泚文可胜なものずしおマヌクする方法を远求するこずに興味があるかもしれたせん。それは、非同期/埅機ずは関係のない圱響を䞎える将来の蚭蚈䜜業です。

リファレンス

挔算子の構文を埅぀

他の蚀語のasync / await機胜ずの倧きな違いの1぀は、await挔算子の構文です。 これは、Rustの蚭蚈で行った他のどの決定よりも、膚倧な量の議論の察象ずなっおいたす。

2015幎以降、Rustには人間工孊的な゚ラヌ凊理のための接尟蟞?挔算子がありたす。 1.0よりずっず前から、Rustにはフィヌルドアクセスずメ゜ッド呌び出しのための接尟蟞.挔算子もありたした。 先物の䞻芁なナヌスケヌスはある皮のIOを実行するこずであるため、先物の倧郚分はResultず評䟡されたす。
䞀皮の゚ラヌ。 これは、実際には、ほがすべおのawait操䜜が?たたはその埌のメ゜ッド呌び出しのいずれかでシヌケンスされるこずを意味したす。 プレフィックス挔算子ずポストフィックス挔算子の暙準的な優先順䜍を考えるず、これにより、ほがすべおの埅機挔算子が(await future)?ず蚘述されるこずになり、これは非垞に非人間的であるず芋なされたした。

したがっお、 ?および.挔算子で非垞によく構成される埌眮構文を䜿甚するこずにしたした。 倚くの異なる構文オプションを怜蚎した埌、 .挔算子の埌にawaitキヌワヌドを䜿甚するこずを遞択したした。

リファレンス

シングルスレッド゚グれキュヌタずマルチスレッド゚グれキュヌタの䞡方をサポヌト

Rustは、単䞀のスレッドで実行されるプログラムを䜜成する人にコストをかけるこずなく、䞊行プログラムず䞊列プログラムの䜜成を容易にするように蚭蚈されおいたす。 シングルスレッド゚グれキュヌタずマルチスレッド゚グれキュヌタの䞡方で非同期関数を実行できるこずが重芁です。 これら2぀のナヌスケヌスの䞻な違いは、マルチスレッド゚グれキュヌタはSendによっおスポヌンできる先物を制限し、シングルスレッド゚グれキュヌタは制限しないこずです。

impl Trait構文の既存の動䜜ず同様に、非同期関数は、返す将来の自動特性を「リヌク」したす。 ぀たり、発信者は、倖郚リタヌンタむプが未来であるかどうかを確認するだけでなく、その本䜓の怜査に基づいお、そのタむプが送信か同期かを確認するこずもできたす。 これは、非同期fnのリタヌンタむプがマルチスレッド゚グれキュヌタにスケゞュヌルされおいる堎合、これが安党かどうかをチェックできるこずを意味したす。 ただし、タむプはSendである必芁はない

非同期関数をメ゜ッドに拡匵するず、これがうたく機胜しないずいう懞念がありたしたが、いく぀かの議論の結果、状況に倧きな違いはないず刀断されたした。

リファレンス

既知の安定化ブロッカヌ

州のサむズ

問題52924

ステヌトマシンぞの非同期倉換が珟圚実装されおいる方法はたったく最適ではなく、状態が必芁以䞊に倧きくなっおいたす。 状態サむズは実際には超線圢に倧きくなるため、状態サむズが通垞のシステムスレッドのサむズよりも倧きくなるず、実際のスタックでスタックオヌバヌフロヌがトリガヌされる可胜性がありたす。 サむズがより合理的で、少なくずも通垞の䜿甚でスタックオヌバヌフロヌを匕き起こすほど悪くないように、このcodegenを改善するこずは、ブロッキングバグ修正です。

非同期関数の耇数のラむフタむム

問題56238

非同期関数は、シグニチャに耇数のラむフタむムを持぀こずができる必芁がありたす。これらはすべお、関数が呌び出されたずきに評䟡される将来に「キャプチャ」されたす。 ただし、コンパむラ内での珟圚のimpl Futureぞの䞋げは、耇数の入力ラむフタむムをサポヌトしおいたせん。 䜜成するには、より深いリファクタリングが必芁です
この䜜品。 ナヌザヌは耇数のおそらくすべお省略された入力ラむフタむムを持぀関数を䜜成する可胜性が非垞に高いため、これはブロッキングバグ修正です。

その他のブロッキングの問題

ラベル

今埌の仕事

これらはすべお既知であり、MVPの非垞に優先床の高い拡匵機胜であり、async / awaitの初期バヌゞョンが出荷されたらすぐに䜜業を開始する予定です。

非同期クロヌゞャ

最初のRFCでは、クロヌゞャヌリテラルの修食子ずしお非同期修食子もサポヌトし、匿名の非同期関数を䜜成したした。 ただし、この機胜を䜿甚した経隓から、このナヌスケヌスを安定させる前に解決すべき蚭蚈䞊の質問がただたくさんあるこずがわかりたした。

  1. 倉数キャプチャの性質は、非同期クロヌゞャではより耇雑になり、構文サポヌトが必芁になりたす。
  2. 入力ラむフタむムを䜿甚しお非同期関数を抜象化するこずは珟圚䞍可胜であり、远加の蚀語たたはラむブラリのサポヌトが必芁になる堎合がありたす。

非STDサポヌト

await挔算子の珟圚の実装では、TLSが内郚の未来をポヌリングするずきに、りェむカヌを䞋に枡す必芁がありたす。 これは本質的に、TLSを䜿甚するシステムで構文をできるだけ早く機胜させるための「ハック」です。 長期的には、このTLSの䜿甚を確玄する぀もりはなく、通垞の関数の匕数ずしおwakerを枡すこずをお勧めしたす。 ただし、これには、匕数を取るこずを凊理できるように、ステヌトマシン生成コヌドをさらに深く倉曎する必芁がありたす。

この倉曎の実装をブロックしおいたせんが、TLSをサポヌトしおいないシステムで非同期/埅機を䜿甚できないため、優先床が高いず考えおいたす。 これは玔粋な実装の問題です。システムの蚭蚈では、TLSを䜿甚する必芁はありたせん。

非同期特性メ゜ッド

珟圚、トレむトで非同期関連の関数たたはメ゜ッドを蚱可しおいたせん。 これは、 fn曞き蟌むこずができるが、 async fnを曞き蟌むこずができない唯䞀の堎所です。 非同期メ゜ッドは明らかに匷力な抜象化であり、私たちはそれらをサポヌトしたいず考えおいたす。

非同期メ゜ッドは、futureを実装する関連型を返すメ゜ッドずしお機胜的に扱われたす。 各非同期メ゜ッドは、そのメ゜ッドが倉換するステヌトマシンの䞀意のfutureタむプを生成したす。

ただし、そのfutureはすべおの入力をキャプチャするため、入力の有効期間たたはタむプパラメヌタもその状態でキャプチャする必芁がありたす。 これは、ゞェネリック関連型ず呌ばれる抂念ず同等です。これは、私たちが長い間望んでいた機胜ですが、ただ適切に実装されおいたせん。 したがっお、非同期メ゜ッドの解決は、ゞェネリック関連タむプの解決に関連付けられおいたす。

未解決の蚭蚈䞊の問題もありたす。 たずえば、非同期メ゜ッドは、同じシグネチャを持぀将来の型を返すメ゜ッドず互換性がありたすか さらに、非同期メ゜ッドを䜿甚しおトレむトを抜象化するずきに、䞀郚の非同期メ゜ッドによっお返されるfutureに自動トレむトを実装するように芁求する必芁がある堎合があるため、非同期メ゜ッドには自動トレむトに関する远加の問題がありたす。

この最小限のサポヌトさえあれば、非同期メ゜ッドを「オブゞェクトセヌフ」にする可胜性など、将来の拡匵のための他の蚭蚈䞊の考慮事項がありたす。

ゞェネレヌタヌず非同期ゞェネレヌタヌ

同じコルヌチンステヌトマシン倉換を䜿甚しお、耇数の倀を生成する関数を取埗し、それらをステヌトマシンに倉換する、䞍安定なゞェネレヌタヌ機胜がありたす。 この機胜の最も明癜な䜿甚䟋は、非同期関数がコンパむルされるのず同じように、「むテレヌタ」にコンパむルされる関数を䜜成するこずです。
先物。 同様に、これら2぀の機胜を構成しお、非同期ゞェネレヌタヌむテレヌタヌず同等の非同期性である「ストリヌム」にコンパむルされる関数を䜜成するこずもできたす。 ネットワヌクプログラミングでは、これには非垞に明確な䜿甚䟋がありたす。これには、システム間で送信されるメッセヌゞのストリヌムが含たれるこずがよくありたす。

ゞェネレヌタヌは、倚くの可胜なオプションを備えた非垞に柔軟な機胜であるため、倚くの未解決の蚭蚈䞊の質問がありたす。 構文ずラむブラリAPIに関するRustのゞェネレヌタヌの最終的な蚭蚈は、ただ非垞に空䞭であり、䞍確実です。

A-async-await AsyncAwait-Focus F-async_await I-nominated T-lang disposition-merge finished-final-comment-period

最も参考になるコメント

䞊蚘のマヌゞする傟向のある最埌のコメント期間が完了したした。

ガバナンスプロセスの自動化された代衚ずしお、著者ず他のすべおの貢献者に感謝したす。

RFCはたもなくマヌゞされたす。

党おのコメント58件

@rfcbotfcpマヌゞ

チヌムメンバヌ@withoutboatsはこれをマヌゞするこずを提案したした。 次のステップは、タグ付けされた残りのチヌムメンバヌによるレビュヌです。

  • [x] @Centril
  • [x] @cramertj
  • [x] @eddyb
  • [x] @joshtriplett
  • [x] @nikomatsakis
  • [] @pnkfelix
  • [x] @scottmcm
  • [x] @withoutboats

懞念

レビュヌアの過半数が承認するずそしお最倧2぀の承認が未解決になるず、これが最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

タグ付けされたチヌムメンバヌが私に䞎えるこずができるコマンドに぀いおは、このドキュメントを参照しおください。

䞊蚘のレポヌトに既存のブロッカヌを登録しお、スリップしないようにしおください

@rfcbotは実装-䜜業-ブロック-安定化に関係したす

チヌムメンバヌ...これをマヌゞするこずを提案

Githubの問題プルリク゚ストではないをどのようにマヌゞできたすか

@viボットは少し

うわヌ、包括的な芁玄をありがずう 私は接線方向にしかフォロヌしおいたせんが、あなたがすべおの䞊にいるず完党に確信しおいたす。

@rfcbotレビュヌ

「トリアヌゞAsyncAwait-䞍明な問題」を安定化ブロッカヌに明瀺的に远加するおよび/たたはその懞念を登録するこずは可胜でしょうか

私はhttps://github.com/rust-lang/rust/issues/60414が重芁だず思いたす明らかに、それは私のバグですp、少なくずも安定化の前に明瀺的に延期したいず思いたす:)

Rustチヌムがこの機胜に泚力しおくれたコミュニティに感謝の意を衚したいず思いたす。 倚くの蚭蚈、議論、およびコミュニケヌションのいく぀かの故障がありたしたが、少なくずも私、そしお願わくば他の倚くの人は、それを通しお私たちがRustのために可胜な最良の解決策を芋぀けたず確信しおいたす。 倚田

ずはいえ、将来の可胜性ずしお、完了ベヌスの非同期キャンセルシステムAPIぞのブリッゞングに関する問題に぀いお蚀及したいず思いたす。TL; DRただ所有されおいるバッファヌを枡す必芁がありたす。これはラむブラリの問題ですが、1぀です。蚀及しお。

たた、完了ベヌスのAPIの問題に぀いおも蚀及したいず思いたす。 コンテキストに぀いおは、この内郚スレッドを参照しおくださいIOCPずio_uring導入を考えるず、Linuxでの非同期IOの方法になる可胜性があるため、それらを凊理するための明確な方法を甚意するこずが重芁だず思いたす。 IIUCの仮想非同期ドロップのアむデアは安党に実装できず、所有バッファを枡すこずは利䟿性が䜎䞋し、パフォヌマンスが䜎䞋する可胜性がありたすたずえば、ロヌカリティが悪化したり、コピヌが远加されたりするため。

@newpavlov Fuchsiaにも同様のこずを実装したしたが、非同期ドロップなしで実行するこずは完党に可胜です。 これを行うには、いく぀かの異なるルヌトがありたす。たずえば、リ゜ヌスの取埗で叀いリ゜ヌスのクリヌンアップ䜜業が完了するたで埅機する必芁があるリ゜ヌスプヌリングを䜿甚する堎合などです。 珟圚のfuturesAPIは、本番システムでこれらの問題を効果的に解決するために䜿甚でき、䜿甚されおきたした。

ただし、この問題は、すでに安定しおいる先物API蚭蚈ず盎亀するasync / awaitの安定化に関するものです。 さらに質問をするか、先物-rsレポに関する議論のために問題を開いおください。

@Ekleog

「トリアヌゞAsyncAwait-䞍明な問題」を安定化ブロッカヌに明瀺的に远加するおよび/たたはその懞念を登録するこずは可胜でしょうか

うん、それは私たちが毎週やっおいるこずです。 その特定の問題60414をWRTするず、それは重芁であり、修正されるこずを望んでいるず思いたすが、特に-> impl Traitすでに芳察可胜であるため、安定化をブロックする必芁があるかどうかはただ決定できおいたせん

@cramertjありがずうございたす 60414の問題は基本的に「゚ラヌはすぐに発生する可胜性がある」ず思いたすが、 -> impl Traitするず、これたで誰も気づかなかったように芋えたす。ずにかく延期されおも問題ありたせん。いく぀かの問題がありたす。 :)FWIW、それは私が䞡方を返す関数の䞭で自然なコヌドで発生した必芁がありたす()堎所ずでT::Assoc IIRCはそれをコンパむルするために取埗する私はできない䜜られた別の、 -ただし、60414を開いおからコヌドをチェックしおいないので、私の蚘憶が間違っおいる可胜性がありたす

@Ekleogうん、それは理にかなっおいる なぜそれが苊痛になるのかははっきりずわかりたす。その特定の問題をさらに掘り䞋げるためにた。

線集気にしないでください、私は1.38タヌゲットを逃したした。

@cramertj

これを行うには、いく぀かの異なるルヌトがありたす。たずえば、リ゜ヌスの取埗で叀いリ゜ヌスのクリヌンアップ䜜業が完了するたで埅機する必芁があるリ゜ヌスプヌリングを䜿甚する堎合などです。

将来の状態の䞀郚ずしおバッファヌを保持する堎合ず比范しお、効率が䜎䞋したせんか 私の䞻な懞念は、珟圚の蚭蚈がれロコストではなく async抜象化を削陀するこずでより効率的なコヌドを䜜成できるずいう意味で、完了ベヌスのAPIでは人間工孊的ではないずいうこずです。それを修正する明確な方法はありたせん。 決しお目立たないものではありたせんが、そのようなデザむンの欠陥を忘れないこずが重芁だず思いたすので、OPで蚀及しおいただきたいず思いたす。

@theduke

もちろん、langチヌムはこれを私よりもよく刀断できたすが、安定した実装を確保するために1.38に遅らせるこずは、はるかに賢明なように思われたす。

この問題は1.38を察象ずしおいたす。説明の最初の行を参照しおください。

@huxiありがずう、私はそれを逃した。 コメントを線集したした。

@newpavlov

将来の状態の䞀郚ずしおバッファヌを保持する堎合ず比范しお、効率が䜎䞋したせんか 私の䞻な懞念は、珟圚の蚭蚈がれロコストではなく非同期抜象化を削陀するこずでより効率的なコヌドを䜜成できるずいう意味で、完了ベヌスのAPIで人間工孊的ではなく、修正する明確な方法がないこずです。それ。 決しお目立たないものではありたせんが、そのようなデザむンの欠陥を忘れないこずが重芁だず思いたすので、OPで蚀及しおいただきたいず思いたす。

いいえ、必ずしもそうずは限りたせんが、async / awaitの安定化ずは関係がないため、このディスカッションを別のスレッドの問題に移したしょう。

ずはいえ、将来の可胜性ずしお、完了ベヌスの非同期キャンセルシステムAPIぞのブリッゞングに関する問題に぀いお蚀及したいず思いたす。TL; DRただ所有されおいるバッファヌを枡す必芁がありたす。これはラむブラリの問題ですが、1぀です。蚀及しお。

たた、完了ベヌスのAPIの問題に぀いおも蚀及したいず思いたす。 コンテキストに぀いおは、この内郚スレッドを参照しおくださいLinuxでの非同期IOの方法になる可胜性のあるIOCPずio_uringの導入を考慮するず、それらを凊理するための明確な方法を甚意するこずが重芁だず思いたす。

この問題空間でのAPI蚭蚈の議論はトピックから倖れるずいうテむラヌに同意したすが、非同期/安定化埅ちに関連するこれらのコメントの1぀の特定の偎面および䞀般的なio_uringに関するこの議論に察凊したいず思いたす。タむミング。

io_uringは、2019幎にLinuxに登堎するむンタヌフェヌスです。Rustプロゞェクトは、4幎前の2015幎から先物の抜象化に取り組んでいたす。 完了ベヌスのAPIよりもポヌリングベヌスを優先するずいう基本的な遞択は、2015幎ず2016幎に行われたした。2015幎のRustCampで、 Carl Lercheは、基瀎ずなるIO抜象化であるmioでその遞択を行った理由に぀いお話したした。 2016幎のこのブログ投皿で、 Aaron Turonは、より高いレベルの抜象化を䜜成するこずの利点に぀いお話したした。 これらの決定はずっず前に行われたものであり、私たちはそれらがなければ今のずころに到達するこずはできたせんでした。

基瀎ずなる先物モデルを再怜蚎する必芁があるずいう提案は、3〜4幎前の状態に戻しお、その時点からやり盎す必芁があるずいう提案です。 アヌロンが説明したように、より高いレベルのプリミティブにオヌバヌヘッドを導入するこずなく、完了ベヌスのIOモデルをカバヌできるのはどのような抜象化ですか そのモデルを、ナヌザヌがasync / awaitのように「通垞のRust +マむナヌアノテヌション」を蚘述できる構文にどのようにマッピングしたすか これらのステヌトマシンでピンを䜿甚しお行ったように、それをメモリモデルに統合する方法をどのように凊理できるでしょうか。 これらの質問ぞの回答を提䟛しようずするこずは、このスレッドではトピックから倖れたす。 重芁なのは、それらに答え、正しい答えを蚌明するこずが仕事であるずいうこずです。 これたでのずころ、さたざたな貢献者の間で10幎間の劎働幎数に盞圓するものは、もう䞀床やり盎す必芁がありたす。

錆の目暙は、人々が䜿甚できる補品、そしお我々が出荷しなければならないこずを意味を出荷するこずです。 来幎倧事になるかもしれない将来を芋据えお、それを取り入れるために蚭蚈プロセスを再開するこずを垞に止められるわけではありたせん。 私たちは自分たちが眮かれおいる状況に基づいお最善を尜くしたす。明らかに、倧きなこずをほずんど芋逃しおいないように感じるのはむラむラするかもしれたせんが、珟状では、a最良の結果に぀いおの党䜓像もありたせん。 io_uringを凊理するためには、b゚コシステム党䜓でio_uringがどれほど重芁になるか。 これに基づいお4幎間の䜜業を元に戻すこずはできたせん。

他のスペヌスでは、Rustにはすでに同様の、おそらくさらに深刻な制限がありたす。 去幎の秋にニック・フィッツゞェラルドず䞀緒に芋たもの、wasmGC統合を匷調したいず思いたす。 wasmで管理察象オブゞェクトを凊理する蚈画は、基本的にメモリスペヌスをセグメント化しお、管理察象倖オブゞェクトずは別のアドレス空間に存圚するようにするこずです実際、い぀かは倚くの個別のアドレス空間に存圚したす。 Rustのメモリモデルは、個別のアドレススペヌスを凊理するように蚭蚈されおいないだけであり、今日のヒヌプメモリを凊理する安党でないコヌドは、アドレススペヌスが1぀しかないこずを前提ずしおいたす。 砎壊的な解決策ず技術的に砎壊的ではないが非垞に砎壊的な技術的解決策の䞡方をスケッチしたしたが、Rustの制限に察凊しおいるため、wasmGCストヌリヌが完党に最適ではない可胜性があるこずを受け入れるこずが最も可胜性の高い方法です。それが存圚したす。

ここで安定しおいる興味深い偎面は、安党なコヌドから自己参照構造䜓を利甚できるようにしおいるこずです。 これを面癜くしおいるのは、 Pin<&mut SelfReferentialGenerator> 、ゞェネレヌタヌの状態党䜓を指す可倉参照 Pinフィヌルドずしお栌玍されおいるがあり、その状態内にポむンタヌがあるこずです。状態の別の郚分に。 その内郚ポむンタは、可倉参照で゚むリアスしたす

私の知る限り、可倉参照は、別のフィヌルドぞのポむンタが指すメモリの郚分に実際にアクセスするために䜿甚されたせん。 特に、自己参照以倖のポむンタヌを䜿甚しおポむンタヌ先フィヌルドを読み取るcloneメ゜ッドなどはありたせん。それでも、これは、コア゚コシステムの他の䜕よりも、特にrustc自䜓に付属しおいるもの。 ここで乗っおいる「線」は非垞に现くなっおいるので、可倉参照に基づいお実行したいこれらの優れた最適化をすべお倱わないように泚意する必芁がありたす。

特にPinはすでに安定しおいるため、珟時点でできるこずはおそらくほずんどありたせんが、゚むリアシングが蚱可されおいるルヌルが最終的にどのようなものであっおも、これはこずを指摘する䟡倀がありたす。そうではありたせん。 Stacked Borrowsが耇雑だず思った堎合は、事態が悪化するこずに備えおください。

Cc https://github.com/rust-lang/unsafe-code-guidelines/issues/148

私の知る限り、可倉参照は、別のフィヌルドぞのポむンタが指すメモリの郚分に実際にアクセスするために䜿甚されたせん。

これらすべおのコルヌチンタむプにDebug実装させるこずに぀いお人々は話したしたが、その䌚話では、安党でないコヌドガむドラむンを統合しお、印刷をデバッグしおも安党かどうかを確認する必芁があるようです。

人々はこれらすべおのコルヌチンタむプにデバッグを実装させるこずに぀いお話したしたが、その䌚話は安党でないコヌドガむドラむンも統合しお、䜕が安党にデバッグできるかを確認する必芁があるようです。

それはそう。 このようなDebug実装は、自己参照フィヌルドを出力する堎合、ゞェネレヌタヌ内でのMIRレベルの参照ベヌスの最適化を犁止する可胜性がありたす。

ブロッカヌに関する曎新

2぀の高レベルブロッカヌは䞡方ずも倧きな進歩を遂げおおり、実際には䞡方ずも終了する可胜性がありたす。 これに関する@ cramertj @ tmandryず@nikomatsakisからの詳现情報は玠晎らしいでしょう

  • 耇数のラむフタむムの問題は61775で修正されおいるはずです
  • サむズの問題はよりあいたいです。 やるべき最適化は垞にもっずありたすが、明らかな指数関数的増加のフットガンを回避するずいう䜎い成果はほずんど解決されたず思いたすか

これにより、この機胜を安定させる䞊での䞻芁な障害ずしお、ドキュメントずテストが残りたす。 @Centrilは、機胜が十分にテストたたは掗緎されおいないずいう懞念を䞀貫しお衚明しおいたす。 @Centrilは、この機胜を安定させるためにチェックオフできる特定の懞念事項を列挙した堎所はありたすか

誰かがドキュメントを運転しおいるかどうかはわかりたせん。 本やリファレンスなどのツリヌ内のドキュメントの改善に集䞭したい人は誰でも玠晎らしいサヌビスを提䟛するでしょう 先物レポやareweasyncyetのようなツリヌ倖のドキュメントには、少し䜙分な時間がありたす。

今日の時点で、ベヌタ版がカットされるたで6週間あるので、これらの䜜業を完了するために4週間8月1日たでがあるずしたしょう。1.38をスリップしないず確信しおいたす。

サむズの問題はよりあいたいです。 やるべき最適化は垞にもっずありたすが、明らかな指数関数的増加のフットガンを回避するずいう䜎い成果はほずんど解決されたず思いたすか

私はそう信じおいたす、そしお他のいく぀かも最近閉鎖されたした。 しかし、他にもブロッキングの問題が

@Centrilは、この機胜を安定させるためにチェックオフできる特定の懞念事項を列挙した堎所はありたすか

テストしたいもののリストが蚘茉されたドロップボックスペヌパヌがあり、 https//github.com/rust-lang/rust/issues/62121があり

本やリファレンスなどのツリヌ内のドキュメントの改善に集䞭したい人は誰でも玠晎らしいサヌビスを提䟛するでしょう

それはそう; 参考たでにPRを確認させおいただきたす。 たた、cc @ ehuss。


たた、 async unsafe fn MVPから独自の機胜ゲヌトに移動したいず思いたす。aほずんど䜿甚されおいない、b特に十分にテストされおいない、c衚面䞊、 .awaitポむントは、 unsafe { ... }を曞く堎所ではありたせん。これは、「リヌク実装POV」からは理解できたすが、゚フェクトPOVからはそれほど理解できたせん。d議論がほずんど芋られず、RFCに含たれおいたせんでした。たた、このレポヌト、およびe const fnを䜿甚しおこれを実行したずころ、正垞に機胜したした。 機胜ゲヌティングPRを曞くこずができたす

async unsafe fnを䞍安定にするこずは問題ありたせんが、珟圚のデザむンずは異なるデザむンになっおしたうこずに懐疑的です。 しかし、それを理解する時間を䞎えるのは賢明なようです

async unsafe fnを別の機胜ゲヌトに移動するためのhttps://github.com/rust-lang/rust/issues/62500を䜜成し、ブロッカヌずしおリストしたした。 おそらく、適切な远跡の問題も䜜成する必芁があるず思いたす。

async unsafe fn別の蚭蚈に到達するこずに非垞に懐疑的であり、安定化の最初のラりンドにそれを含めないずいう決定に驚いおいたす。 安党ではないasync fnいく぀か曞いたので、それらをasync fn really_this_function_is_unsafe()か䜕かにするでしょう。 これは、呌び出しにunsafe { ... }を必芁ずする関数を定矩できるずいう点で、Rustナヌザヌが持っおいる基本的な期埅の回垰のようです。 さらに別の機胜ゲヌトは、 async / awaitが未完成であるずいう印象に貢献したす。

@cramertjは私たちが議論すべきだず思われたす この远跡の問題が過負荷にならないようにするために、

将来のサむズに関しおは、すべおのawaitポむントに圱響するケヌスが最適化されたす。 私が知っおいる最埌の残りの問題は59087です。ここでは、埅぀前に未来を借りるず、その未来に割り圓おられたサむズが2倍になる可胜性がありたす。 これはかなり残念なこずですが、それでも以前よりもかなり良くなっおいたす。

私はその問題を修正する方法を考えおいたすが、これが私が理解しおいるよりもはるかに䞀般的でない限り、安定したMVPの劚げになるべきではありたせん。

そうは蚀っおも、これらの最適化がフクシアに䞎える圱響を調べる必芁がありたすしばらくの間ブロックされおいたしたが、今日たたは明日は解消されるはずです。 より倚くのケヌスを発芋する可胜性は十分にあり、それらのいずれかをブロックする必芁があるかどうかを刀断する必芁がありたす。

@cramertj リマむンダヌ私はasync / awaitを䜿甚し、async unsafeを安定させるためではなく、async / awaitの安定化を遅らせるための議論のように聞こえたす。

特にRFCに含たれおいなかったため、この方法で匷制された堎合、別の「匕数の䜍眮に暗黙の特性」のシットストヌムが発生する可胜性がありたす。

[ここで実際に議論する䟡倀のない補足「さらに別の機胜ゲヌトは、async / awaitが未完成であるずいう印象を䞎える」ため、async / awaitを䜿甚するず、数時間ごずにバグが芋぀かり、少数の人に広がっおいたす。 rustcチヌムがそれらを修正するために合法的に必芁な月数であり、それは私にそれが未完成であるず蚀わせるものです。 最埌のものは数日前に修正されたした。新しいrustcでコヌドをコンパむルしようずしたずきに、別のものが芋぀からないこずを本圓に望んでいたすが ]

あなたの議論は、適切な実隓ず思考なしに今のずころ安党でない非同期を安定させるためではなく、非同期/埅機の安定化を遅らせるための議論のように聞こえたす。

いいえ、それはそのための議論ではありたせん。 async unsafe準備ができおいるず思いたすが、他のデザむンは想像できたせん。 この最初のリリヌスにそれを含めないこずには、マむナスの結果しかないず思いたす。 async / await党䜓、特にasync unsafeを遅らせるこずで、より良い結果が埗られるずは思いたせん。

他のデザむンは想像できたせん

代替蚭蚈ですが、耇雑な拡匵が確実に必芁です。 async unsafe fnは.awaitではなく、 unsafeから.await call()です。 この背埌にある理由は、 async fnが呌び出されおimpl Future䜜成された時点で、「安党でないこずは䜕こずです。 そのステップが行うのは、デヌタを構造䜓に詰め蟌むこずだけです実際、すべおのasync fnは呌び出すconstです。 安党でない実際のポむントは、 poll未来を前進させるこずです。

぀たり、 unsafeが即時の堎合は、 unsafe async fn方が理にかなっおおり、 unsafeが遅れおいる堎合は、 async unsafe fn方が理にかなっおいたす。

もちろん、私たちは決しお蚀っお方法を取埗しない堎合は䟋えばunsafe Futureのすべおのメ゜ッドどこFuture 、その埌、「巻き䞊げ」、呌び出すこずが安党ではないunsafeの䜜成にimpl Future 、そしおそのunsafeの契玄は、結果ずしお生じる未来を安党な方法で䜿甚するこずです。 しかし、これは、 asyncブロックに手動で「脱糖」するだけでunsafe async fnなしでほが​​簡単に行うこずもできたす unsafe fn os_stuff() -> impl Future { async { .. } } 。

ただし、それに加えお、䜜成時に保持する必芁のないpoll ingが開始されたら、保持する必芁のある䞍倉条件を実際に存圚させる方法が存圚するかどうかずいう問題がありたす。 Rustでは、安党な型にunsafeコンストラクタヌを䜿甚するのが䞀般的なパタヌンです䟋 Vec::from_raw_parts 。 しかし、重芁なのは、構築埌、タむプを誀甚するこずは_できない_ずいうこずです。 unsafeスコヌプは終了したした。 この安党性の範囲は、Rustの保蚌の鍵です。 ポヌリングの方法ずタむミングの芁件を備えた安党なimpl Futureを䜜成するunsafe async fnを導入し、それを安党なコヌドに枡すず、その安党なコヌドは突然安党でない障壁の内偎になりたす。 そしお、これは、倖郚コンビネヌタを通過する可胜性が高いため、この未来をすぐに埅぀以倖の方法で䜿甚するずすぐに発生する可胜性がありたす。

これのTL; DRは、安定させる前に適切に議論する必芁があるasync unsafe fnコヌナヌが間違いなくあるこずだず思いたす。特に、 const Traitの方向性が導入される可胜性がありたすドラフトブログがありたすこれを「匱い」効果システムに䞀般化するこずに぀いおの投皿 fn -modifyingキヌワヌド。 ただし、 unsafe async fnは、実際には、安定するためにunsafeの「順序付け」/「配眮」に぀いお十分に明確である可胜性がありたす。

゚フェクトベヌスのunsafe Future特性は、今日の蚀語やコンパむラで衚珟する方法を知っおいるものの手の届かないずころにあるだけでなく、远加の゚フェクトのために最終的にはより悪い蚭蚈になるず思いたす-コンビネヌタが必芁ずする倚型。

async fnが呌び出され、impl Futureが䜜成される時点では、安党でないこずは䜕もできたせん。 そのステップが行うのは、デヌタを構造䜓に詰め蟌むこずだけです事実䞊、すべおのasync fnはconstを呌び出したす。 安党でない実際のポむントは、䞖論調査で未来を前進させるこずです。

これは、以来、事実だasync fn前にあるこずにすべおのナヌザヌコヌドを実行するこずはできたせん.await線をするたで、すべおの未定矩の動䜜が可胜性が遅れるこずになる.await呌ばれたした。 ただし、UBのポむントずunsafe tyのポむントには重芁な違いがあるず思いたす。 unsafe tyの実際のポむントは、API䜜成者が、静的に怜蚌できない䞍倉条件のセットが満たされるこずをナヌザヌが玄束する必芁があるず刀断した堎合、それらの䞍倉条件に違反した結果がUBを匕き起こさない堎合でもです。埌で他の安党なコヌドで。 この䞀般的な䟋の1぀は、安党なメ゜ッド正確にはこれが䜕であるかを䜿甚しおトレむトを実装する倀を䜜成するunsafe関数です。 これは、たずえば、実装がunsafe䞍倉条件に䟝存するVisitor -trait-implementing型を、型を構築するためにunsafeを芁求するこずにより、適切に䜿甚できるようにするために䜿甚されたす。 他の䟋には、 slice::from_raw_partsようなものが含たれたす。これ自䜓はUBを匕き起こしたせんが型の有効性の䞍倉条件は別ずしお、結果のスラむスぞのアクセスは匕き起こしたす。

async unsafe fnがここでナニヌクで興味深いケヌスを衚しおいるずは思いたせん。これは、 unsafe芁求するこずにより、安党なむンタヌフェむスの背埌でunsafe動䜜を実行するための確立されたパタヌンに埓いたす。コンストラクタ。

@cramertjあなたがこれに぀いお議論しなければならないずいう事実そしお私は珟圚の解決策が悪いものだず思う、たたは私がより良い考えを持っおいるず私は瀺唆しおいたせんは、私にずっお、この議論はさびを気にする人が埓うべき堎所RFCリポゞトリ。

念のため、Readmeからの匕甚

次の堎合は、このプロセスに埓う必芁がありたす[...]

  • バグ修正ではない蚀語ぞのセマンティックたたは構文の倉曎。
  • [...そしお匕甚されおいないもの]

珟圚のデザむンに倉曎が生じるず蚀っおいるわけではありたせん。 実は、数分考えおみるず、思い぀く限り最高のデザむンだず思いたす。 しかし、プロセスは私たちの信念がRustにずっお危険になるのを避けるこずを可胜にするものであり、RFCリポゞトリをフォロヌしおいるが、ここでのプロセスに埓わないこずによっおすべおの問題を読んでいない倚くの人々の知恵を倱っおいたす。

プロセスに埓わないこずが理にかなっおいる堎合がありたす。 ここでは、2週間のFCP遅延を回避するためだけに、プロセスを無芖する必芁がある緊急性は芋圓たりたせん。

ですから、錆がコミュニティに正盎に蚀っお、それが独自のreadmeで䞎える玄束に぀いお正盎に蚀っおください。そしお、少なくずも受け入れられたRFCがあり、できれば実際にそれがさらに䜿甚されるたで、その機胜を機胜ゲヌトの䞋に眮いおください。 それがasync / await機胜ゲヌト党䜓であろうず、安党でない非同期機胜ゲヌトだけであろうず、私は気にしたせんが、AFAIKasync-wgを超えおほずんど䜿甚されおおらず、コミュニティ党䜓。

私は本の参考資料で最初のパスを曞いおいたす。 途䞭で、async-await RFCが、 ?挔算子の動䜜がただ決定されおいないず蚀っおいるこずに気づきたした。 それでも、非同期ブロック遊び堎では正垞に機胜しおいるようです。 それを別の機胜ゲヌトに移動する必芁がありたすか それずも、それはある時点で解決されたしたか 安定化レポヌトには衚瀺されたせんでしたが、芋萜ずした可胜性がありたす。

私はZulipでもこの質問を

はい、 return 、 break 、 continueの動䜜ずずもに議論および解決されたした。 al。 これらはすべお「唯䞀可胜なこず」を実行し、クロヌゞャ内での動䜜ず同じように動䜜したす。

let f = unsafe { || {...} };も安党に呌び出すこずができ、IIRCはunsafeをクロヌゞャヌの内偎に移動するのず同じです。
unsafe fn foo() -> impl Fn() { || {...} }に぀いおも同じです。

これは、私にずっお、「 unsafeスコヌプを離れた埌に危険なこずが起こる」ための十分な前䟋です。

同じこずが他の堎所にも圓おはたりたす。 以前に指摘したように、 unsafeは、朜圚的なUBが存圚する堎所であるずは限りたせん。 䟋

    let mut vec: Vec<u32> = Vec::new();

    unsafe { vec.set_len(100); }      // <- unsafe

    let val = vec.get(5).unwrap();     // <- UB
    println!("{}", val);

私には安党ではないずいう誀解のように思えたす。安党ではないずいうこずは、「ここで安党でない操䜜が発生した」ずいうこずではなく、「ここで必芁な䞍倉条件を支持しおいるこずを保蚌しおいる」ずいうこずです。 埅機ポむントで䞍倉条件を支持しおいる可胜性がありたすが、倉数パラメヌタヌが含たれおいないため、䞍倉条件を支持しおいるこずを確認するための非垞に明癜なサむトではありたせん。 呌び出しサむトで䞍倉条件を維持するこずを保蚌するこずは、はるかに理にかなっおおり、安党でないすべおの抜象化がどのように機胜するかずはるかに䞀貫しおいたす。

これは、安党でないこずを効果ずしお考えるこずが䞍正確な盎感に぀ながる理由に関連しおいたすラルフが昚幎そのアむデアが最初に提起されたずきに䞻匵したように。 安党性は、具䜓的には、意図的に、感染性ではありたせん。 他の安党でない関数を呌び出し、その䞍倉条件を呌び出しスタックに転送するだけの安党でない関数を䜜成するこずはできたすが、これは安党でない関数が䜿甚される通垞の方法ではなく、実際には、倀のコントラクトを定矩しお手動でチェックするために䜿甚される構文マヌカヌです。あなたはそれらを支持したす。

したがっお、すべおの蚭蚈決定にRFC党䜓が必芁なわけではありたせんが、決定がどのように行われるかに぀いお、より明確で構造を提䟛するように取り組んできたした。 この号の冒頭の䞻芁な決定点のリストはその䞀䟋です。 私たちが利甚できるツヌルを䜿甚しお、安党でない非同期fnsのこの問題に関する構造化されたコンセンサスポむントを突き刺したいので、これは䞖論調査を含む芁玄投皿です。

async unsafe fn

async unsafe fnsは、安党でないブロック内でのみ呌び出すこずができる非同期関数です。 圌らの䜓の䞭は危険なスコヌプずしお扱われたす。 䞻な代替蚭蚈は、非同期安党ではないFNS危険な埅぀のではなく、ぞの呌び出しを行うこずであろう。 呌び出すのが安党でない蚭蚈を奜む確かな理由はいく぀かありたす。

  1. これは、呌び出すのも安党ではない非同期の安党でないfnsの動䜜ず構文的に䞀臎しおいたす。
  2. これは、䞀般的に安党でないこずがどのように機胜するかずより䞀臎しおいたす。 安党でない関数は、呌び出し元によっお支持されおいるいく぀かの䞍倉条件に䟝存する抜象化です。 ぀たり、「安党でない操䜜が発生する堎所」をマヌクするこずではなく、「䞍倉条件が維持されるこずが保蚌される堎所」をマヌクするこずに぀いおです。 匕数が遞択されお怜蚌されたずきずは別に、埅機サむトよりも、匕数が実際に指定されおいる呌び出しサむトで䞍倉条件が支持されおいるこずを確認する方がはるかに賢明です。 これは䞀般的に安党でない関数ではごく普通のこずであり、他の安党な関数が正しいず期埅する状態を決定するこずがよくありたす。
  3. これは、async fnシグニチャの脱糖の抂念ずより䞀貫性があり、async修食子を削陀しお、将来的に戻り型をラップするのず同等のシグニチャをモデル化できたす。
  4. 代替案は、短期的たたは䞭期的数幎を意味するで実斜するこずは実行可胜ではありたせん。 珟圚蚭蚈されおいるRust蚀語でポヌリングするのが安党でない未来を䜜成する方法はありたせん。 ある皮の「効果ずしおの安党でない」は、広範囲にわたる圱響を及がし、珟圚すでに存圚する安党でないものずの䞋䜍互換性通垞の安党でない関数やブロックなどに察凊する必芁がある倧きな倉曎になりたす。 非同期の安党でないfnsを远加しおも、その状況は倧きく倉わりたせんが、珟圚の安党ではないずいう解釈の䞋での非同期の安党でないfnsには、短期および䞭期的に実際の実甚的なナヌスケヌスがありたす。

@rfcbot ask lang「安定化非同期安党でないfnを、呌び出すのが安党でない非同期fnずしお受け入れたすか」

rfcbotで投祚する方法がわかりたせんが、少なくずも指名したした。

チヌムメンバヌ@withoutboatsがチヌムに質問したしたT-lang、コンセンサスのために

「安定化非同期安党でないfnを、呌び出すのが安党でない非同期fnずしお受け入れたすか」

  • [x] @Centril
  • [x] @cramertj
  • [x] @eddyb
  • [] @joshtriplett
  • [x] @nikomatsakis
  • [] @pnkfelix
  • [] @scottmcm
  • [x] @withoutboats

@withoutboats

安党でない非同期fnsのこの問題に関する構造化されたコンセンサスポむントを突き刺したいので、これは投祚付きの芁玄投皿です。

蚘事をありがずう。 議論の結果、今日は毎晩機胜するasync unsafe fnが正しく動䜜するこずを確信したした。 たばらに芋えたので、おそらくいく぀かのテストを远加する必芁がありたす。たた、レポヌトの䞀郚ずasync unsafe fn動䜜の説明を䜿甚しお、レポヌトの䞊郚を修正しおください。

これは、䞀般的に安党でないこずがどのように機胜するかずより䞀臎しおいたす。 安党でない関数は、呌び出し元によっお支持されおいるいく぀かの䞍倉条件に䟝存する抜象化です。 ぀たり、「安党でない操䜜が発生する堎所」をマヌクするこずではなく、「䞍倉条件が維持されるこずが保蚌される堎所」をマヌクするこずに぀いおです。 匕数が遞択されお怜蚌されたずきずは別に、埅機サむトよりも、匕数が実際に指定されおいる呌び出しサむトで䞍倉条件が支持されおいるこずを確認する方がはるかに賢明です。 これは䞀般的に安党でない関数ではごく普通のこずであり、他の安党な関数が正しいず期埅する状態を決定するこずがよくありたす。

あたり泚意を払っおいない人ずしお、私は同意し、ここでの解決策は優れたドキュメントだず思いたす。

私はここでマヌクから倖れおいるかもしれたせんが、それを考えるず

  • 先物は本質的に組み合わせであり、構成可胜であるこずが基本です。
  • 将来の実装内の埅機ポむントは、通垞、目に芋えない実装の詳现です。
  • 将来は実行コンテキストから非垞に離れおおり、実際のナヌザヌはルヌトではなく䞭間にある可胜性がありたす。

特定の埅機䞭の䜿甚法/動䜜に䟝存する䞍倉条件は、悪い考えず安党であるず刀断するこずは䞍可胜の間のどこかにあるように私には思えたす。

埅機䞭の出力倀が䞍倉条件の維持に関係しおいる堎合がある堎合、将来は、次のように、安党でないアクセスを必芁ずするラッパヌである出力を持぀可胜性があるず思いたす。

struct UnsafeOutput<T>(T);
impl<T> UnsafeOutput<T> {
    unsafe fn unwrap(self) -> T { self.0 }
}

この「初期の安党ではない」のunsafeネスがasyncネスの前にあるこずを考えるず、修食子の順序がasync unsafe fnよりもunsafe async fn方がはるかに幞せです。 async unsafe fn 、 unsafe (async fn)は、 async (unsafe fn)よりも明らかにその動䜜にマッピングされるためです。

どちらも喜んで受け入れたすが、ここで公開されおいるラッピングの順序は倖偎にunsafeがあるず匷く感じおおり、修食子の順序がこれを明確にするのに圹立ちたす。  unsafeの改質剀であるasync fn 、ではないasyncに修食子unsafe fn 。

どちらも喜んで受け入れたすが、ここで公開されおいるラッピングの順序は倖偎にunsafeがあるず匷く感じおおり、修食子の順序がこれを明確にするのに圹立ちたす。  unsafeの改質剀であるasync fn 、ではないasyncに修食子unsafe fn 。

私はあなたの最埌の括匧で囲たれたポむントたであなたず䞀緒にいたした。 @withoutboatsの蚘事は、安党性がコヌルサむトで凊理された堎合、実際に持っおいるのはunsafe fn 非同期コンテキストで呌び出されるであるこずを私にはっきりず瀺しおいたす。

バむクシェッドasync unsafe fnをペむントするず思いたす。

async unsafe fn方が理にかなっおいるず思いたすが、非同期、安党でない、定数の間の任意の順序を文法的に受け入れる必芁があるずも思いたす。 しかし、 async unsafe fnは、非同期を削陀し、戻りタむプを「脱糖」に倉曎するずいう抂念で、私にはより理にかなっおいたす。

代替案は、短期的たたは䞭期的数幎を意味するで実斜するこずは実行可胜ではありたせん。 珟圚蚭蚈されおいるRust蚀語でポヌリングするのが安党でない未来を䜜成する方法はありたせん。

FWIW unsafe fn内のクロヌゞャず関数特性に関しお、 unsafe async fnが安党なpollメ゜ッドでFuture unsafe async fnを返すずは思っおいたせんでしたが、代わりにunsafe UnsafeFutureを返したした。ポヌリングメ゜ッド。 * unsafe { }ブロック内で䜿甚されおいる堎合、 .awaitをUnsafeFuture .awaitでも機胜させるこずができたすが、それ以倖の堎合は機胜したせん。

これらの2぀の将来の特性は、珟圚の特性に関しお倧きな倉化であり、おそらく倚くの構成可胜性の問題を匕き起こすでしょう。 したがっお、代替案を暡玢するための船はおそらく出航したした。 特に、これは今日のFnトレむトの動䜜ずは異なるためたずえば、 UnsafeFnトレむトなどがなく、 RFC2585での私の問題は、 unsafe fn内にクロヌゞャヌを䜜成するこずimpls Fn()クロヌゞャヌを返したす。぀たり、このクロヌゞャヌは安党でない関数を呌び出すこずができたすが、安党に呌び出すこずができたす。

「安党でない」未来や閉鎖を䜜成するこずは問題ではありたせん。問題は、そうするこずが安党であるこずを蚌明せずにそれらを呌び出すこずです。特に、圌らのタむプがこれを行う必芁があるず蚀っおいない堎合はそうです。

*すべおのFutureにUnsafeFuture包括的実装を提䟛できたす。たた、 UnsafeFutureにunsafeメ゜ッドを提䟛しおそれ自䜓を「アンラップ」するこずもできたす。 Futureに安党であるpoll 。

これが私の2セントです

  • @cramertjの説明https://github.com/rust-lang/rust/issues/62149#issuecomment-510166207は、 unsafe非同期関数が正しい蚭蚈であるこずを私に確信させたす。
  • 私はキヌワヌドunsafeずasync固定された順序を非垞に奜みたす
  • 順序付けはより論理的であるように思われるため、 unsafe async fnの順序付けを少し奜みたす。 「高速電気自動車」ず「電気高速自動車」に䌌おいたす。 䞻な理由は、 async fn fn脱糖するためです。 したがっお、2぀のキヌワヌドが隣り合っおいるこずは理にかなっおいたす。

let f = unsafe { || { ... } }はf安党にするべきであり、 UnsafeFn特性は決しお導入されるべきではなく、先隓的な.await ingずasync unsafe fnは安党な。 UnsafeFutureは、匷力な正圓化が必芁です。

unsafeは明瀺的である必芁があり、Rustはあなたを安党な土地に戻す必芁があるため、これはすべお続きたす。 たた、このトヌクンによっお、 fの...は安党でないブロックではなく、 https//github.com/rust-lang/rfcs/pull/2585を採甚し、 async unsafe fnは安党なボディである必芁がありたす。

この最埌の点はかなり重芁だず思いたす。 すべおのasync unsafe fnがunsafeブロックを䜿甚する可胜性がありたすが、同様にほずんどの堎合、安党性分析の恩恵を受け、倚くの堎合、間違いを犯しやすいほど耇雑に聞こえたす。

特にクロヌゞャをキャプチャするずきは、ボロヌチェッカヌをバむパスしないでください。

だからここに私のコメント https //github.com/rust-lang/rust/issues/62149#issuecomment-511116357は非垞に悪い考えです。

UnsafeFuture特性では、発信者は将来をポヌリングするためにunsafe { }を曞き蟌む必芁がありたすが、たずえばBox<dyn UnsafeFuture>を取埗した堎合、発信者はそこでどの矩務を蚌明する必芁があるかわかりたせん。 unsafe { future.poll() }安党ですか すべおの未来のために わからない。 したがっお、 @ rpjohnstが同様のUnsafeFn特性の䞍和に぀いお指摘したように、これは完党に圹に立たないでしょう。

Futureを垞にポヌリングに察しお安党であるように芁求するこずは理にかなっおおり、ポヌリングに察しお安党でなければならないFutureを構築するプロセスは安党でない可胜性がありたす。 それがasync unsafe fnだず思いたす。 ただし、その堎合、 fnアむテムは、返された未来を安党にポヌリングできるように、䜕を支持する必芁があるかを文曞化できたす。

@rfcbotの実装-䜜業-ブロック-安定化

私の知る限り、ただ2぀の既知の実装ブロッカヌがありhttps://github.com/rust-lang/rust/issues/61949、https://github.com/rust-lang/rust/issues/62517、それでもいく぀かのテストを远加するのは良いこずです。 rfcbotが時間的にブロッカヌにならないようにするずいう懞念を解決し、代わりに実際に修正をブロックしたす。

@rfcbotは実装-䜜業-ブロック-安定化を解決したす

bell䞊蚘のこれは珟圚、最終コメント期間に入っおいたす。 ベル

https://github.com/rust-lang/rust/pull/63209に安定化PRを提出したした

䞊蚘のマヌゞする傟向のある最埌のコメント期間が完了したした。

ガバナンスプロセスの自動化された代衚ずしお、著者ず他のすべおの貢献者に感謝したす。

RFCはたもなくマヌゞされたす。

ここで安定しおいる興味深い偎面は、安党なコヌドから自己参照構造䜓を利甚できるようにしおいるこずです。 これを興味深いものにしおいるのは、Pin <mut SelfReferentialGenerator>に、ゞェネレヌタヌの状態党䜓を指す可倉参照Pinのフィヌルドずしお栌玍されおいるがあり、その状態内に状態の別の郚分を指すポむンタヌがあるこずです。 。 その内郚ポむンタは、可倉参照で゚むリアスしたす

これのフォロヌアップずしお、 @ comexは実際に、 LLVMのnoaliasアノテヌションに違反する安党な非同期Rustコヌドを、珟圚の方法でこずに成功したした。 ただし、TLSを䜿甚しおいるためず思われ、珟圚、誀コンパむルはありたせん。

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