ひとつめ: async関数はなぜ関数自体の性質としてasyncなのか?つまりは、callerがその時の都合や気分でcalleeを非同期か同期かを選ぶ設計は無理なのか、デメリットが大きすぎるのか?
Conversation
Notices
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:40:34 JST 斎藤ただし -
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:40:33 JST ロージー / ハト @tadd goroutine と aync は別っしょ
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:40:34 JST 斎藤ただし これ、goroutineというやつでは?💡
コルーチンとは微妙に基本が別物ぽいのかな -
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:41:30 JST 斎藤ただし @rosylilly また別なんですね!なんとなーくの違和感でいろいろ調べて、今そんな雰囲気を感じ取っていました。(当方この辺まじ素人)
-
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:42:41 JST ロージー / ハト @tadd 何を async を指してるかによるけど ECMAScript 文脈における async なら Promise を返すもの、と思っていいと思うし、それは関数の性質そのものがそうで、Go における goroutine はあくまでシンプルな軽量スレッド(みたいなもん)でしかない
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:44:07 JST 斎藤ただし @rosylilly あ、たしかに→何を指してるか。たしかにJSやRustのそれが考えの発端ではあるんですが、それに限らず一般的な何かを知ろうとしてました
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:44:27 JST 斎藤ただし @rosylilly 「callerがその時の都合や気分でcalleeを非同期か同期かを選ぶ」部分だけは合ってるのだろうか…とかは思いつつ調べてます。酒の肴ができてしまった
-
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:44:27 JST ロージー / ハト @tadd goroutine はつまるところ軽量スレッドの起動なのでまぁ気分で選ぶといっていいと思うが、それは callee の非同期というより非同期なステートメントの実行という方が正しく、関数単位の文脈で検討する要素ではない
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:46:11 JST 斎藤ただし @rosylilly ごめん、「というより」の前後の違いがよく分かってないです。関数定義の時点で決める必要があるかないか、という話でした
-
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:47:16 JST ロージー / ハト @tadd 関数定義時点では goroutine は全く関係ないっすね。async の方は Promise を返すものなので関数定義時点で決める必要がある
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:48:09 JST 斎藤ただし @rosylilly うん、それが前提で話しておりました
-
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:49:33 JST ロージー / ハト @tadd だとすると逆に何が疑問なのかわからんな、もう解決してない?
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:51:34 JST 斎藤ただし @rosylilly たしかに。最初の「無理なのか?」は「できらぁ」で終わりですね、Goがそうやってる。
とするとJSやRustがそれを選ばなかっただけ、てことになるので、選ぶ選ばないのメリデメがあるのかなー、というのが次に思い浮かびました -
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:53:42 JST ロージー / ハト @tadd あ〜〜〜それでいうと Go は channel を使った goroutine 間の通信を前提としていて、待ち合わせが異様にめんどくさいんだよね。async / await みたいに「この時点で値が必要になるので待つ」みたいな処理を書こうと思うと結構面倒なコード書く必要になる、と思う。async / await の方が待ち合わせに便利なんだが、それは別スレッドじゃないので並行ではあるが並列でない、という認知負荷的な問題はありそう
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:54:41 JST 斎藤ただし @rosylilly なるほどー💡それはとてもわかり易くてありがた情報。自分の勉強の取っ掛かりにもとてもよくてありがたいです
-
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 12:59:12 JST ロージー / ハト @tadd ちょっと書くと……
async / await
function main() {
const waiter = asyncF();
...
const needValue = await waiter();
}↑ 素直に asyncF で生成した Promise の値が欲しくなったら await で待つ
goroutine
func main() {
receiver := make(chan val)go func() {
receiver <- heavyLoad();
}()select {
case needValue := <-receiver:
}
}↑ チャンネル作ってそれを関数なり goroutine に渡して send してもらって recv の待ち合わせを書く、みたいなだるさ
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 13:00:15 JST 斎藤ただし @rosylilly 分かりやすいーなるほど。
-
Embed this notice
ロージー / ハト (rosylilly@best-friends.chat)'s status on Saturday, 30-Mar-2024 13:01:17 JST ロージー / ハト @tadd あ、あと goroutine 作るとコールスタックが別になるので例外投げるとかが異様に面倒などがある!Go は例外使うな文化なのはそういう事情もあるとおもう
-
Embed this notice
斎藤ただし (tadd@best-friends.chat)'s status on Saturday, 30-Mar-2024 13:11:50 JST 斎藤ただし @rosylilly はーなるほど、それもつらひー…いずれにせよ「開発者の負担が増える」というのは言えそうですね
-
Embed this notice