Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。
公式
https://golang.org
公式ドキュメント
https://golang.org/doc/
公式外パッケージドキュメント
https://godoc.org
ブラウザ上で試し書き
https://play.golang.org
※前スレ
Go language part 4
https://mevius.5ch.net/test/read.cgi/tech/1605467680/
Go language part 5
■ このスレッドは過去ログ倉庫に格納されています
2022/02/27(日) 07:43:20.04ID:uWHjNeVw
499デフォルトの名無しさん
2022/08/20(土) 04:18:43.73ID:O8Vd08Ya >>473
ginのルーティングが糞なのは直ってるの?
ginのルーティングが糞なのは直ってるの?
500デフォルトの名無しさん
2022/08/20(土) 08:17:30.29ID:9Gwmc6Wf 実際goをつかいはじめのころはチャンネルの仕様とか使いかたとか調べるのが面倒で
勝手しったるmutexばっかりつかっていた
勝手しったるmutexばっかりつかっていた
501デフォルトの名無しさん
2022/08/20(土) 08:27:18.78ID:jhGGjByr よーわからんし、echoで問題ないから使ってる
502デフォルトの名無しさん
2022/08/20(土) 11:47:33.07ID:O8Vd08Ya 俺もecho
503デフォルトの名無しさん
2022/08/20(土) 23:47:54.29ID:McSzx8ex gin → beego → echo → chi イマココ
504デフォルトの名無しさん
2022/08/30(火) 15:48:26.25ID:F+/knOGo 言語仕様書の1.17を底本として翻訳してるんだけど、文書的に酷い(~;~の使いすぎが特に…)し、構成的にもクソだなぁ
underlying type に関係した性質なんて文書全体を読まんと把握できないわ
メソッド式の話では、ポインタによるレシーバーのメソッドは値による呼び出しは出来ないとか書いてあるけど、レシーバー宣言が値だろうがポインタだろうが、現行じゃ問題なく呼べるようになってる(更には値でセレクタ呼んでもポインタで呼んでも動く
つまりどこかで仕様が拡張されてるのに、仕様書は更新されてないっぽい疑惑
underlying type に関係した性質なんて文書全体を読まんと把握できないわ
メソッド式の話では、ポインタによるレシーバーのメソッドは値による呼び出しは出来ないとか書いてあるけど、レシーバー宣言が値だろうがポインタだろうが、現行じゃ問題なく呼べるようになってる(更には値でセレクタ呼んでもポインタで呼んでも動く
つまりどこかで仕様が拡張されてるのに、仕様書は更新されてないっぽい疑惑
505デフォルトの名無しさん
2022/08/30(火) 15:50:42.61ID:F+/knOGo 仕様書なんて熟読しなくても、フィーリングで書いて動いちゃうから、今まで気にしたこともなかったし
気にしなくても動くんだからいいじゃない?とも思いはする
気にしなくても動くんだからいいじゃない?とも思いはする
506デフォルトの名無しさん
2022/08/30(火) 22:31:49.83ID:1po1mIkW そんないいかげんな感覚で思い付きどんどん拡張したその結果が今のC++のていたらくだ!!
反省しなさい!
反省しなさい!
507デフォルトの名無しさん
2022/08/31(水) 00:35:38.08ID:Pib5lp7c C++があんなことになったのはむしろ、C++プログラマたるもの仕様書くらい熟読しているだろうと開発陣が高を括ってきた結果だろう
508デフォルトの名無しさん
2022/08/31(水) 10:19:04.29ID:3xNaBMUA あんなブ厚いARMを読むなんて苦行が過ぎる
悟りに至りかねない危険な行為だ
悟りに至りかねない危険な行為だ
509デフォルトの名無しさん
2022/08/31(水) 12:04:18.42ID:3xNaBMUA あるえー?
仕様書で終了ステートメントに続くステートメントに関する記述が無いんで、Playgroundでmainの最初にreturnを書いたらコンパイルエラーにならんかったし実行時エラーも起きない
到達不能ステートメントはチェックされないんだな
仕様書で終了ステートメントに続くステートメントに関する記述が無いんで、Playgroundでmainの最初にreturnを書いたらコンパイルエラーにならんかったし実行時エラーも起きない
到達不能ステートメントはチェックされないんだな
510デフォルトの名無しさん
2022/08/31(水) 12:08:28.43ID:rT6IO02J そもそも規格化されてる言語じゃないし、コミュニティが用意した言語仕様書にそこまで大きな意味はないんじゃないの?
仮に処理系と内容が違っててもどっちのバグなのか第三者にはわからないこともあるだろう
仮に処理系と内容が違っててもどっちのバグなのか第三者にはわからないこともあるだろう
511デフォルトの名無しさん
2022/08/31(水) 14:11:42.15ID:LHsSKudI いかにも仕事が雑なグーグルらしい雑な仕様の言語
512デフォルトの名無しさん
2022/08/31(水) 15:08:28.04ID:ZrN/2uvg そうか?Googleの割にはまともだったから普及したんだと思うぞ
いつものGoogleはWeb系のノリで言語作るからこんなもんじゃない、そして大コケする
いつものGoogleはWeb系のノリで言語作るからこんなもんじゃない、そして大コケする
513デフォルトの名無しさん
2022/08/31(水) 16:28:21.64ID:wsiOIOpJ Rustほど初心者が書きにくくはないし
PythonやRubyよりは確実に速い
ちょうど良いところを付いたと思うよ
PythonやRubyよりは確実に速い
ちょうど良いところを付いたと思うよ
514デフォルトの名無しさん
2022/08/31(水) 17:49:58.71ID:QWrElnZY だがバグらないために気を付けないといけないことが多い
515デフォルトの名無しさん
2022/08/31(水) 18:35:42.76ID:rT6IO02J なんかしらんけどGoがしんどいなら使わなくてもいいんだよ
516デフォルトの名無しさん
2022/08/31(水) 20:53:39.37ID:3xNaBMUA バグらないために気を付けなきゃならんことなんて、他の言語に比べるとそんなに多くないだろ
517デフォルトの名無しさん
2022/08/31(水) 21:04:49.54ID:v1Af5w53 100 Go Mistakesを読むといいよ
518デフォルトの名無しさん
2022/09/01(木) 09:53:36.13ID:dbQKPphW 言語設計でしくじってるよなぁと思うのは、構造体の生成回りの構文というか思想
Cに引っ張られ過ぎてて生成の基本が実体を作ることになってる
構造体はデフォルトでアドレスとして出現し、Javaとかのように参照と命名しとけばよかった
そうすればスライスとかマップのイテレーションがクソみたいな落とし穴にならないし、マップをインデックス式でアクセスしてセレクタとしてフィールドにアクセスも出来るようにできた
実体を使いたい場合は*でデリファレンスして使う
実体ちゃんの変数も*Tという型とする
実体配列は[]*Tという配列を記述するようにする
*に関しては、レシーバーとか宣言で(r *T)とかデリファレンス演算子をポインタを示す記号に使うような一貫性のなさも解消する
プリミティブな変数が実体で、そのアドレスを&で取得するということからの一貫性に拘ってるんだろなぁ
実体配列なんて、Dockerの管理用配列以外で見たことないよ…少なくともレアな宣言だと思う
Cに引っ張られ過ぎてて生成の基本が実体を作ることになってる
構造体はデフォルトでアドレスとして出現し、Javaとかのように参照と命名しとけばよかった
そうすればスライスとかマップのイテレーションがクソみたいな落とし穴にならないし、マップをインデックス式でアクセスしてセレクタとしてフィールドにアクセスも出来るようにできた
実体を使いたい場合は*でデリファレンスして使う
実体ちゃんの変数も*Tという型とする
実体配列は[]*Tという配列を記述するようにする
*に関しては、レシーバーとか宣言で(r *T)とかデリファレンス演算子をポインタを示す記号に使うような一貫性のなさも解消する
プリミティブな変数が実体で、そのアドレスを&で取得するということからの一貫性に拘ってるんだろなぁ
実体配列なんて、Dockerの管理用配列以外で見たことないよ…少なくともレアな宣言だと思う
519デフォルトの名無しさん
2022/09/01(木) 11:44:46.07ID:8wwpfCzj 欠点を挙げる流れだ
やっぱ入れ子の構造体の初期化でしょいかんよあれは
やっぱ入れ子の構造体の初期化でしょいかんよあれは
520デフォルトの名無しさん
2022/09/01(木) 12:50:03.20ID:cWwvmbGP521デフォルトの名無しさん
2022/09/01(木) 12:54:11.77ID:dbQKPphW 複合リテラルとして書けばいいんだし、落とし穴的な問題はなくない?
俺は悪くないかなと思ってるんだけど
俺は悪くないかなと思ってるんだけど
522デフォルトの名無しさん
2022/09/01(木) 13:00:51.78ID:dbQKPphW >>520
「これらの多くは、チャネルでの送信または受信の欠落、またはチャネルの閉鎖が原因です」
いや、mallocしといてfreeしてませんでしたレベルの話をされてもどうしろと?
普通に対策考えないでプログラミングなんてできないだろ
「これらの多くは、チャネルでの送信または受信の欠落、またはチャネルの閉鎖が原因です」
いや、mallocしといてfreeしてませんでしたレベルの話をされてもどうしろと?
普通に対策考えないでプログラミングなんてできないだろ
523デフォルトの名無しさん
2022/09/01(木) 14:02:59.57ID:dbQKPphW524デフォルトの名無しさん
2022/09/01(木) 14:17:02.40ID:3zc//kWQ525デフォルトの名無しさん
2022/09/01(木) 17:08:27.97ID:V2mDAtzH データ競合はあまり遭遇したことないな
無駄に並列化したがるバカがチームにいると地獄を見るだろうというのはわかる
channel絡みのミスで固まるのはよくある
無駄に並列化したがるバカがチームにいると地獄を見るだろうというのはわかる
channel絡みのミスで固まるのはよくある
526デフォルトの名無しさん
2022/09/01(木) 18:05:50.03ID:Wlby5VAy527デフォルトの名無しさん
2022/09/01(木) 18:16:08.12ID:0As8hqIp きつい現場のGoは他の言語より殊更きつそうだというのはわかるわ
528デフォルトの名無しさん
2022/09/02(金) 02:30:51.60ID:bNDG9t// channelは複雑なデータのやり取りに使うには難しすぎると感じるね
どこで詰まるかわかったもんじゃないし
公式がまともなフレームワーク用意するわけでもないし
どこで詰まるかわかったもんじゃないし
公式がまともなフレームワーク用意するわけでもないし
529デフォルトの名無しさん
2022/09/02(金) 03:08:08.96ID:xpSIPhaW epollを使うよりかはマシだし
530デフォルトの名無しさん
2022/09/02(金) 08:58:55.58ID:0WCZpZUS いや、Goに限らない問題でGoのダメなところとか言われてもなぁ
531デフォルトの名無しさん
2022/09/02(金) 09:55:02.48ID:zLWkNNSX いや、けっこうGoに限った問題
channelのユースケースの大部分は現実にはpromise/futureで十分で、遥かにミスを引き起こしにくい
channelのユースケースの大部分は現実にはpromise/futureで十分で、遥かにミスを引き起こしにくい
532デフォルトの名無しさん
2022/09/02(金) 09:58:48.22ID:0WCZpZUS 例えばCとかでファイルを排他オープンしたままクローズし忘れて書き込みのままになってて、別の箇所で読み込もうとしたけど開けなかったとして
これはC言語の不備だとか言うのか?と
これはC言語の不備だとか言うのか?と
533デフォルトの名無しさん
2022/09/02(金) 10:04:00.39ID:0WCZpZUS >>531
chan のユースケースといったら、パイプとしてストリーム的にデータを流すのが主だと思うんだが、promise, future でどうやって代替するの?
chan のユースケースといったら、パイプとしてストリーム的にデータを流すのが主だと思うんだが、promise, future でどうやって代替するの?
534デフォルトの名無しさん
2022/09/02(金) 10:06:18.95ID:0WCZpZUS >>531
select文のあたりでも書かれてたと思うけど、同期を取る目的じゃなくてパイプからの機能だよチャネル
select文のあたりでも書かれてたと思うけど、同期を取る目的じゃなくてパイプからの機能だよチャネル
535デフォルトの名無しさん
2022/09/02(金) 10:10:39.85ID:0WCZpZUS >>531
同期取るなら、sync.WaitGroup 使えばよくない?
同期取るなら、sync.WaitGroup 使えばよくない?
536デフォルトの名無しさん
2022/09/02(金) 12:33:43.05ID:Xv0heE2X537デフォルトの名無しさん
2022/09/02(金) 12:45:23.85ID:bNDG9t// いや普通に同期を取る使い方もできるだろw
完了通知を待つ使い方
俺もその使い方しかしてない
async/awaitなんで構文として追加しても良いと思うのだけどね
channelは非同期機構を実装するパーツとしては優秀だから
フレームワークが欲しい
完了通知を待つ使い方
俺もその使い方しかしてない
async/awaitなんで構文として追加しても良いと思うのだけどね
channelは非同期機構を実装するパーツとしては優秀だから
フレームワークが欲しい
538デフォルトの名無しさん
2022/09/02(金) 13:40:10.47ID:D0FuWgPr そもそも本当にパイプとしてストリーム的にデータを流す必要のあるケースなんて稀
Goがchannel推しだから利用者もそれに引き摺られてストリームっぽい設計になりがちなだけで、結果として単一の値(又は配列)を返せれば殆どのケースでは十分
本当にストリームが必要ならJavaScriptのasync generatorのような設計も可能で、producerとconsumerが協調するからchannelより遥かに安全だ
Goがchannel推しだから利用者もそれに引き摺られてストリームっぽい設計になりがちなだけで、結果として単一の値(又は配列)を返せれば殆どのケースでは十分
本当にストリームが必要ならJavaScriptのasync generatorのような設計も可能で、producerとconsumerが協調するからchannelより遥かに安全だ
539デフォルトの名無しさん
2022/09/02(金) 13:56:23.23ID:iQ46VdDW そもそもストリームモデルが必要なユースケースってほぼ
分散環境だと思うんだよな
分散環境だと思うんだよな
540デフォルトの名無しさん
2022/09/03(土) 12:27:35.16ID:62gf404N 分散環境なら外部のメッセージバスに投げるだけだよね
せっかく小さいgoroutineを気軽にポコポコ起こせるデザインなのに、
結果を受け取る方法が、データ競合を起こさないように最大限注意して共有変数を使うか、パラダイムのミスマッチなchannelを使うかなのは片手落ちに感じる
単純にgoroutineの返り値をwaitできるようにしない理由ってあるんだろうか?既に議論されてたら知りたい
せっかく小さいgoroutineを気軽にポコポコ起こせるデザインなのに、
結果を受け取る方法が、データ競合を起こさないように最大限注意して共有変数を使うか、パラダイムのミスマッチなchannelを使うかなのは片手落ちに感じる
単純にgoroutineの返り値をwaitできるようにしない理由ってあるんだろうか?既に議論されてたら知りたい
541デフォルトの名無しさん
2022/09/03(土) 13:39:36.59ID:Aru3Abt3 >パラダイムのミスマッチなchannel
kwsk
kwsk
542デフォルトの名無しさん
2022/09/03(土) 20:41:16.91ID:eoULSfLD543デフォルトの名無しさん
2022/09/03(土) 20:49:18.55ID:CkDP1XSv544デフォルトの名無しさん
2022/09/03(土) 20:53:14.26ID:CkDP1XSv545デフォルトの名無しさん
2022/09/03(土) 21:09:58.32ID:2QtFsvwZ パラダイムのミスマッチという理由がわからん。
goroutineは一つの関数を呼ぶためのもんじゃないぞ。
goroutine立てて一連の処理を同期的に書くためのもなんよ。普通に考えれば結果を受け取る必要が無いはずだよ。
どうしても集めるならfan inするように一つのchanで受ける。
Futureは要らないんよ。awaitとかしなくてもそこでCPU占有したり、ioなりなんなりが起これば自動的に別goroutineに制御が渡る。
goroutineは一つの関数を呼ぶためのもんじゃないぞ。
goroutine立てて一連の処理を同期的に書くためのもなんよ。普通に考えれば結果を受け取る必要が無いはずだよ。
どうしても集めるならfan inするように一つのchanで受ける。
Futureは要らないんよ。awaitとかしなくてもそこでCPU占有したり、ioなりなんなりが起これば自動的に別goroutineに制御が渡る。
546デフォルトの名無しさん
2022/09/03(土) 21:10:11.97ID:Aru3Abt3547デフォルトの名無しさん
2022/09/03(土) 21:14:31.20ID:eoULSfLD >>544
その場合は「共有変数を注意深く使う必要がある」よね
その場合は「共有変数を注意深く使う必要がある」よね
548デフォルトの名無しさん
2022/09/03(土) 21:22:59.76ID:eoULSfLD549デフォルトの名無しさん
2022/09/03(土) 21:29:09.46ID:2QtFsvwZ >>548
goroutineで処理すべき単位とか、ワークスティーリングの話してなかったかなと。
goroutineで処理すべき単位とか、ワークスティーリングの話してなかったかなと。
550デフォルトの名無しさん
2022/09/04(日) 00:29:35.08ID:ULs4IOBU まさかこのスレにホーアのCSP本読んでないやついないよな?な?
551デフォルトの名無しさん
2022/09/04(日) 00:54:37.91ID:6UpdVUMR いや、読んでませんが?
552デフォルトの名無しさん
2022/09/04(日) 17:28:10.39ID:GIlWqA7r >>550
読もうとしたけどガチの論理学的数学で挫折
しかしよく調べたらGoが参考にしたのはその本ではなく
最初にホーアが出したもっと簡単な論文の方だった
つまりその本は読む意味はない(Goの並行モデルの理解という意味で)
読もうとしたけどガチの論理学的数学で挫折
しかしよく調べたらGoが参考にしたのはその本ではなく
最初にホーアが出したもっと簡単な論文の方だった
つまりその本は読む意味はない(Goの並行モデルの理解という意味で)
553デフォルトの名無しさん
2022/09/04(日) 18:08:07.32ID:VepAvQjQ554デフォルトの名無しさん
2022/09/04(日) 19:08:07.89ID:VepAvQjQ555デフォルトの名無しさん
2022/09/04(日) 23:01:27.23ID:ULs4IOBU すまない誰かリングにかけろで例えてくれないか?
556デフォルトの名無しさん
2022/09/05(月) 01:58:21.42ID:7mfke0+F Goがpromise(future)/async/awaitをサポートしてくれれば今より容易に安全に書けるケースが増えるのは事実だが、
この件も他の件と同様にGoはサポートしてくれないだろうという悲観的な現実と向き合って、
今ある手段で頑張って代替手段を安全に実現しよう。
この件も他の件と同様にGoはサポートしてくれないだろうという悲観的な現実と向き合って、
今ある手段で頑張って代替手段を安全に実現しよう。
557デフォルトの名無しさん
2022/09/05(月) 04:13:05.73ID:098gBdTn 結局ゴルーチンの実装が中途半端だったんだろうね
分散環境でのストリームモデルならNodeみたいなノンブロッキングIOで外部のソケットを叩けるようにして
シングルスレッドにするのが良かったし
そうでないならFuture/Promiseみたいに安全にデータを受け取れる仕組みが欲しかった
この2つがちょうどうまくできないデザインになっちゃった
分散環境でのストリームモデルならNodeみたいなノンブロッキングIOで外部のソケットを叩けるようにして
シングルスレッドにするのが良かったし
そうでないならFuture/Promiseみたいに安全にデータを受け取れる仕組みが欲しかった
この2つがちょうどうまくできないデザインになっちゃった
558デフォルトの名無しさん
2022/09/05(月) 04:31:49.54ID:098gBdTn またGoの言語仕様にも問題があった
ジェネリクスだ
ジェネリクスがない状態でfuture/promiseを安全に実装できない
なぜかアンチジェネリクス勢がGoには多く
コミュニティでの議論も進展しなかった
つまり全てがゴテゴテに回ってしまった
それならGoogleが並行処理のフレームワークを作ってくれるのかと期待していたが
その気配は全くなく使いにくいcontextのみを放り投げた状態でさあ作れと言った状態
そりゃ普通のユーザーは付いてこれない
ジェネリクスだ
ジェネリクスがない状態でfuture/promiseを安全に実装できない
なぜかアンチジェネリクス勢がGoには多く
コミュニティでの議論も進展しなかった
つまり全てがゴテゴテに回ってしまった
それならGoogleが並行処理のフレームワークを作ってくれるのかと期待していたが
その気配は全くなく使いにくいcontextのみを放り投げた状態でさあ作れと言った状態
そりゃ普通のユーザーは付いてこれない
559デフォルトの名無しさん
2022/09/05(月) 06:36:04.94ID:oqoL/iqD マルチコアを効率よく使うってのがそもそもコンセプトで作られたんだがNodeみたいにしろって意味わからん
560デフォルトの名無しさん
2022/09/05(月) 07:31:00.89ID:yL+fAGmc Goのようにマルチコアを効率よくスケジューリングできて
Goのgoroutineのように多数のタスクを身軽に簡単に起動できて
Goのようにそれらタスク間でchannel通信をすることができて
それらに加えてFuture / async / awaitもサポートしているプログラミング言語がありますよ
偶然ですがその言語は
Goと同じくclassや継承がなく
Goと同じく例外try-throw-catchもなし
Goのgoroutineのように多数のタスクを身軽に簡単に起動できて
Goのようにそれらタスク間でchannel通信をすることができて
それらに加えてFuture / async / awaitもサポートしているプログラミング言語がありますよ
偶然ですがその言語は
Goと同じくclassや継承がなく
Goと同じく例外try-throw-catchもなし
561デフォルトの名無しさん
2022/09/05(月) 09:08:23.21ID:wt43bW0T562デフォルトの名無しさん
2022/09/05(月) 10:05:06.21ID:rnwYkZ6l Goのモデルと比較してのpromiseの優位点としてはこんなとこかな
・一般に、並行性が多少犠牲になる代わりに並行処理の複雑性を局所化する方向へとデザインが誘導される傾向がある。結果としてバグが入り込みにくい。
・ワークフローを集約して記述しやすいため可読性保守性に優れる。
・(channelではなく共有メモリを使う場合と比較して)処理結果を他のスレッドで利用する際にデータ競合が生じない。
・channelと比較して、結果として単一の値を生成するというセマンティクスが型として明確に表現される。デッドロックや閉じ忘れの心配もない。
・一般に、並行性が多少犠牲になる代わりに並行処理の複雑性を局所化する方向へとデザインが誘導される傾向がある。結果としてバグが入り込みにくい。
・ワークフローを集約して記述しやすいため可読性保守性に優れる。
・(channelではなく共有メモリを使う場合と比較して)処理結果を他のスレッドで利用する際にデータ競合が生じない。
・channelと比較して、結果として単一の値を生成するというセマンティクスが型として明確に表現される。デッドロックや閉じ忘れの心配もない。
563デフォルトの名無しさん
2022/09/05(月) 10:15:26.20ID:098gBdTn うーん今の時代にpromiseの利点を理解できない人がいるとは驚きですが仕方ない出血大サービスだ
まず最初にマルチコアを活かすという点についてだが
基本的にゴールチンのような仕組みでは全く活かせないという点を強調しておく
まともにマルチコアのCPUの性能を引き出せるのはSIMD命令を使った計算のみ
SIMDが何なのかわからない人は調べてください
SIMD演算を直接言語でサポートしていないので計算の高速化は論外
ただのマルチスレッドと変わらない
マルチスレッドはOSレベルで実装されており
コンテキストスイッチの負荷も高くCPUキャッシュも消えるし
マルチコアを活かすような作りになってないのはご存知の通り
まず最初にマルチコアを活かすという点についてだが
基本的にゴールチンのような仕組みでは全く活かせないという点を強調しておく
まともにマルチコアのCPUの性能を引き出せるのはSIMD命令を使った計算のみ
SIMDが何なのかわからない人は調べてください
SIMD演算を直接言語でサポートしていないので計算の高速化は論外
ただのマルチスレッドと変わらない
マルチスレッドはOSレベルで実装されており
コンテキストスイッチの負荷も高くCPUキャッシュも消えるし
マルチコアを活かすような作りになってないのはご存知の通り
564デフォルトの名無しさん
2022/09/05(月) 10:28:17.92ID:FE5GsYYc565デフォルトの名無しさん
2022/09/05(月) 10:29:00.06ID:FE5GsYYc データ競合も起きる
566デフォルトの名無しさん
2022/09/05(月) 10:37:15.25ID:098gBdTn 次にpromiseの利点について
並行処理の考え方としては大きく以下がある
1.処理をシーケンシャル実行して1つずつ結果を受け取る
Aが終わったらBを実行して
Bが終わったらCを実行する
2.複数の処理を同時に実行して結果をまとめて受け取る
A、B、C...の処理を同時に実行してその結果をreduceして受け取る
3.ストリーミングモデル
いわゆるproducer/consumerに代表されるようなモデル
1と2についてはpromiseで全て安全に楽に実装できる
ゴルーチンとchannelを使った実装なんか考えたくもない
100%デッドロックが起きる
3についてはゴルーチンとchannelが本来想定してるモデルなのだが
これを適切に実装するのが難しい
CでBlockingQueueの実装したことがある人は分かると思うが極めてデッドロックが起きやすい
複数のproduer/consumerを生成したい場合など考えたくもない
さらにこのモデルの場合は基本的に大規模な分散環境で実行することがほとんどである
シングルノードでproducer/consumerなどサンプルコードでしか有り得ない
こういう用途では複数ノードのソケットにリクエストを投げて結果を待つということになるので結局2に帰着される
並行処理の考え方としては大きく以下がある
1.処理をシーケンシャル実行して1つずつ結果を受け取る
Aが終わったらBを実行して
Bが終わったらCを実行する
2.複数の処理を同時に実行して結果をまとめて受け取る
A、B、C...の処理を同時に実行してその結果をreduceして受け取る
3.ストリーミングモデル
いわゆるproducer/consumerに代表されるようなモデル
1と2についてはpromiseで全て安全に楽に実装できる
ゴルーチンとchannelを使った実装なんか考えたくもない
100%デッドロックが起きる
3についてはゴルーチンとchannelが本来想定してるモデルなのだが
これを適切に実装するのが難しい
CでBlockingQueueの実装したことがある人は分かると思うが極めてデッドロックが起きやすい
複数のproduer/consumerを生成したい場合など考えたくもない
さらにこのモデルの場合は基本的に大規模な分散環境で実行することがほとんどである
シングルノードでproducer/consumerなどサンプルコードでしか有り得ない
こういう用途では複数ノードのソケットにリクエストを投げて結果を待つということになるので結局2に帰着される
567デフォルトの名無しさん
2022/09/05(月) 10:37:39.78ID:098gBdTn つまりpromiseがあれば全ては安全に解決される
ちなみにpromiseはスレッド実装する必要はないことに注意
rustはスレッドで実装されているがNodeはノンブロッキングIOを使っている
他にもグリーンスレッドを使うなどいろいろある
言語側が安全性を担保できるように実装できるのだ
そしてpromiseを型安全に実装するためにはジェネリクスは必須である
以上が私の考える
「ゴルーチンは実装が中途半端で実際のユースケースを考えた場合に非常に残念なことになっている」理由である
反論があればどうぞ
ちなみにpromiseはスレッド実装する必要はないことに注意
rustはスレッドで実装されているがNodeはノンブロッキングIOを使っている
他にもグリーンスレッドを使うなどいろいろある
言語側が安全性を担保できるように実装できるのだ
そしてpromiseを型安全に実装するためにはジェネリクスは必須である
以上が私の考える
「ゴルーチンは実装が中途半端で実際のユースケースを考えた場合に非常に残念なことになっている」理由である
反論があればどうぞ
568デフォルトの名無しさん
2022/09/05(月) 10:37:59.16ID:rnwYkZ6l そりゃpromiseでも共有メモリ触ったり外部のリソースをロックしようとしたりすればデッドロックするでしょう
promiseモデルとは関係ない話
promiseモデルとは関係ない話
569デフォルトの名無しさん
2022/09/05(月) 10:56:03.27ID:88BZgezt570デフォルトの名無しさん
2022/09/05(月) 11:03:44.74ID:098gBdTn >>569
なるほど流石Rust
なるほど流石Rust
571デフォルトの名無しさん
2022/09/05(月) 11:12:30.51ID:098gBdTn ぐちぐち言ってきたが
Goにはゴルーチンとchannelとcontextという良いプリミティブがあるのだから
適切にpromiseを実装して使えるようにして欲しいということ
であれば並行処理がメインのアプリにおいては第一選択にもなり得ると思う
ジェネリクスも入ったのだしやれるはずなんだよ
Googleがもうやる気ないのかもしれないけど
Goにはゴルーチンとchannelとcontextという良いプリミティブがあるのだから
適切にpromiseを実装して使えるようにして欲しいということ
であれば並行処理がメインのアプリにおいては第一選択にもなり得ると思う
ジェネリクスも入ったのだしやれるはずなんだよ
Googleがもうやる気ないのかもしれないけど
572デフォルトの名無しさん
2022/09/05(月) 12:10:29.88ID:E0SFrHzH >>568
channelと比較してデッドロック起きないとか痛い事言っといてそれはないわw
channelと比較してデッドロック起きないとか痛い事言っといてそれはないわw
573デフォルトの名無しさん
2022/09/05(月) 17:07:29.06ID:oqoL/iqD Nodeしかさわったことないから詳しくは知らんけどasyncawaitモデルだと
async関数を使うには呼び出し元にどんどんasyncが汚染されて使いづらいイメージがあるな
その点Goは同期的なコードの一部を並行処理にするってのが非常にやりやすいと思う
タイムアウト処理もselectで簡単に実装できるし、シンプルなfork joinだったらsync.waitgroupで楽に実装できるし
何も困ったことがないな
そんなに優位性があるとは全然思わない
async関数を使うには呼び出し元にどんどんasyncが汚染されて使いづらいイメージがあるな
その点Goは同期的なコードの一部を並行処理にするってのが非常にやりやすいと思う
タイムアウト処理もselectで簡単に実装できるし、シンプルなfork joinだったらsync.waitgroupで楽に実装できるし
何も困ったことがないな
そんなに優位性があるとは全然思わない
574デフォルトの名無しさん
2022/09/05(月) 21:20:50.97ID:MMezNWAp >>573
Goは見かけ同期と誤認するけど
同じOSスレッド上でもメインや複数のGoルーチンがスケジューリングされて交互に非同期で動いているよ
例えばGoで
func1()
func2()
func3()
と見かけ同期に書いているのは
async/await対応言語で
await asyncfunc1()
await asyncfunc2()
await asyncfunc3()
と書いた時と同じ状態
つまり見かけ同期のGoの実態は非同期
「Goは最初から全てがasync汚染されているためasync汚染に気付かずに済む」が正解
Goは見かけ同期と誤認するけど
同じOSスレッド上でもメインや複数のGoルーチンがスケジューリングされて交互に非同期で動いているよ
例えばGoで
func1()
func2()
func3()
と見かけ同期に書いているのは
async/await対応言語で
await asyncfunc1()
await asyncfunc2()
await asyncfunc3()
と書いた時と同じ状態
つまり見かけ同期のGoの実態は非同期
「Goは最初から全てがasync汚染されているためasync汚染に気付かずに済む」が正解
575デフォルトの名無しさん
2022/09/05(月) 22:10:30.31ID:oqoL/iqD >>574
goキーワードなかったら同期的に動くだろ
ライブラリの中でgoキーワードが使われてるから暗黙的に使われるが正しいね。
非同期にしたい部分でgoをつけるのであってつけてないのに全部非同期だってのはおかしな話だな
goキーワードなかったら同期的に動くだろ
ライブラリの中でgoキーワードが使われてるから暗黙的に使われるが正しいね。
非同期にしたい部分でgoをつけるのであってつけてないのに全部非同期だってのはおかしな話だな
576デフォルトの名無しさん
2022/09/05(月) 22:24:10.45ID:M8mFZMdW >>575
それは見かけ上だけ
goを付けなくても読み書きなど含めて時間がかかるものは
見かけ上だけ同期ブロックしているが
実際には非同期で動いており裏で別のgoroutineにスケジューリングされている
そしてその読み込みや書き込みが可能となると
見かけ上だけ同期ブロックしていたところへスケジューリングが戻る仕組みであってGoは常に非同期に動いている
それは見かけ上だけ
goを付けなくても読み書きなど含めて時間がかかるものは
見かけ上だけ同期ブロックしているが
実際には非同期で動いており裏で別のgoroutineにスケジューリングされている
そしてその読み込みや書き込みが可能となると
見かけ上だけ同期ブロックしていたところへスケジューリングが戻る仕組みであってGoは常に非同期に動いている
577デフォルトの名無しさん
2022/09/05(月) 22:30:51.53ID:oqoL/iqD ユーザーに見せてるのは全てブロッキングなコードなわけじゃん
それをgoキーワード使って複数立てた時に非同期で動くって話で、単体の場合はあくまでも同期的に動くよね
mainルーチンでhttp.getってやったら同期的に動いてるよね?
これを別のgoroutineを立てて複数立ち上げればブロックする後は勝手に非同期で動くってだけの話
async汚染はユーザー目線で言ってるね
Goのモデルは既存のコードや構造に手を加えずに一部だけを非同期にするのが容易、これが一つのメリットではあると思う
それをgoキーワード使って複数立てた時に非同期で動くって話で、単体の場合はあくまでも同期的に動くよね
mainルーチンでhttp.getってやったら同期的に動いてるよね?
これを別のgoroutineを立てて複数立ち上げればブロックする後は勝手に非同期で動くってだけの話
async汚染はユーザー目線で言ってるね
Goのモデルは既存のコードや構造に手を加えずに一部だけを非同期にするのが容易、これが一つのメリットではあると思う
578デフォルトの名無しさん
2022/09/05(月) 22:40:11.19ID:oqoL/iqD Node/Denoの作者も同じこと言ってるし、async/awaitモデルの方が優れている一言も言ってないな
むしろGoのモデルをほめてるわ
https://mappingthejourney.com/single-post/2017/08/31/episode-8-interview-with-ryan-dahl-creator-of-nodejs/
必死にasync/awaitの方が優れてるとか言ってるみたいだけど、逆にGoのモデルの方が使いやすいって人もいるわけだよ
自分の意見が全てだと思わない方がいいんじゃないかな
感覚的な話で優れてるって言われてもね
むしろGoのモデルをほめてるわ
https://mappingthejourney.com/single-post/2017/08/31/episode-8-interview-with-ryan-dahl-creator-of-nodejs/
必死にasync/awaitの方が優れてるとか言ってるみたいだけど、逆にGoのモデルの方が使いやすいって人もいるわけだよ
自分の意見が全てだと思わない方がいいんじゃないかな
感覚的な話で優れてるって言われてもね
579デフォルトの名無しさん
2022/09/05(月) 22:48:10.04ID:bm2FICIw580デフォルトの名無しさん
2022/09/05(月) 23:00:13.19ID:oqoL/iqD うんだからユーザーに見せるコードが同期的なことろがわかりやすくて良いって言ってるんだけど?最初その話してたよね?同期的なコードって言ってるよ?
裏でepollやら使ってて非同期だから云々の話はしてないんで
ちなみになんでいちいちID変えるの?
裏でepollやら使ってて非同期だから云々の話はしてないんで
ちなみになんでいちいちID変えるの?
581デフォルトの名無しさん
2022/09/05(月) 23:32:28.26ID:9iTWKe04582デフォルトの名無しさん
2022/09/05(月) 23:43:38.07ID:iWQD5HeB C10K問題から非同期が流行ったのに、メモリーを使いまわしてたら意味ないのでは?
一つのスレッドに一つのスタック、典型的に一つのスタックは1MB準備される。
10Kのスレッドがあれば、10GBのメモリーが必要。
256MBのSUNでは無理。
でも、非同期でも1MBの配列を用意してデータが届くたびに書き足していくなら同じことでは?
一つのスレッドに一つのスタック、典型的に一つのスタックは1MB準備される。
10Kのスレッドがあれば、10GBのメモリーが必要。
256MBのSUNでは無理。
でも、非同期でも1MBの配列を用意してデータが届くたびに書き足していくなら同じことでは?
583デフォルトの名無しさん
2022/09/05(月) 23:47:49.38ID:iWQD5HeB ウェブ・サーバーが静的なファイルを送り出していた2000年ごろなら非同期が大それた力だっただろうけど。
全てが動的な現代において、非同期はめんどくさいだけなのでは?
全てが動的な現代において、非同期はめんどくさいだけなのでは?
584デフォルトの名無しさん
2022/09/05(月) 23:53:52.32ID:YaRYiHc+ 昔より回線が安価になって接続数が多くなったんだから非同期が必要でしょ
585デフォルトの名無しさん
2022/09/05(月) 23:56:02.82ID:iWQD5HeB どういうことですよ?
586デフォルトの名無しさん
2022/09/06(火) 00:05:01.14ID:btul1bBo 静的なファイルを送るだけなら。
カーネルの送信バッファが空くのを待つ
↓
送信バッファと同容量だけ非同期にファイルの読み込みを開始する
↓
ファイルデータが読み込まれると、送信を開始する
↓
最初に戻る
この手順で、典型的なTCP通信なら20KB以下のメモリーで足りる。
でも、動的なコンテンツ生成では、そうはいかないのでは?
カーネルの送信バッファが空くのを待つ
↓
送信バッファと同容量だけ非同期にファイルの読み込みを開始する
↓
ファイルデータが読み込まれると、送信を開始する
↓
最初に戻る
この手順で、典型的なTCP通信なら20KB以下のメモリーで足りる。
でも、動的なコンテンツ生成では、そうはいかないのでは?
587デフォルトの名無しさん
2022/09/06(火) 00:56:32.90ID:jgCBXC4T ヒント:httpは同期通信
588デフォルトの名無しさん
2022/09/06(火) 01:32:17.99ID:h7zKo1Kf >>563 のここがよく分からない
> まともにマルチコアのCPUの性能を引き出せるのはSIMD命令を使った計算のみ
SIMD命令付きのシングルコアCPUもあったじゃん。
古いけど MMX Pentium とか Pentium III とか。
この時代はSIMD命令は何を引き出してたの?
> まともにマルチコアのCPUの性能を引き出せるのはSIMD命令を使った計算のみ
SIMD命令付きのシングルコアCPUもあったじゃん。
古いけど MMX Pentium とか Pentium III とか。
この時代はSIMD命令は何を引き出してたの?
589デフォルトの名無しさん
2022/09/06(火) 02:05:21.99ID:haU306kC >>566
1なんか一つのgoroutineに上から並べるだけで良いじゃん。
1なんか一つのgoroutineに上から並べるだけで良いじゃん。
590デフォルトの名無しさん
2022/09/06(火) 02:06:28.41ID:haU306kC591デフォルトの名無しさん
2022/09/06(火) 03:40:36.05ID:4pNI/aXz >>587
httpを同期で実装するなんて昔のダメなシステムと完全ブロックしても困らない末端クライアントだけたぞ
httpクライアントとして動作する時もサーバーで使うなら同期ブロックしてしまうとスレッド資源を無駄に専有
だからhttpを使うなら何らかの非同期にするのが当たり前
httpを同期で実装するなんて昔のダメなシステムと完全ブロックしても困らない末端クライアントだけたぞ
httpクライアントとして動作する時もサーバーで使うなら同期ブロックしてしまうとスレッド資源を無駄に専有
だからhttpを使うなら何らかの非同期にするのが当たり前
592デフォルトの名無しさん
2022/09/06(火) 06:52:34.65ID:JHpT8XfS >>574
多くの言語でasync/awaitキーワードだらけになって反吐が出る気分だわ、これを良いと考えた人たちを殴りたい...
goにpromise/futureなんて絶対不要、こんなの必要だと思ってる人相当アホやぞ
>「Goは最初から全てがasync汚染されているためasync汚染に気付かずに済む」が正解
なるほど意味わからん
asyncキーワードなんて無いのにスケジューリングで同期実行されるから汚染?ww新理論w
多くの言語でasync/awaitキーワードだらけになって反吐が出る気分だわ、これを良いと考えた人たちを殴りたい...
goにpromise/futureなんて絶対不要、こんなの必要だと思ってる人相当アホやぞ
>「Goは最初から全てがasync汚染されているためasync汚染に気付かずに済む」が正解
なるほど意味わからん
asyncキーワードなんて無いのにスケジューリングで同期実行されるから汚染?ww新理論w
593デフォルトの名無しさん
2022/09/06(火) 08:04:56.91ID:g0koBBSB >>566
1なんてそのまま関数並べるだけだし
2はN件goroutine立ち上げてたらN回チャネル待ち受ければいいだけだよね
タイムアウトもselectで容易に実装できる
100%デッドロックするとか言ってるけどそれはGo超初学者が使った時の話かな?
仮にデッドロックしても検知機構働いてちゃんと落ちるし何が言いたいのか
1なんてそのまま関数並べるだけだし
2はN件goroutine立ち上げてたらN回チャネル待ち受ければいいだけだよね
タイムアウトもselectで容易に実装できる
100%デッドロックするとか言ってるけどそれはGo超初学者が使った時の話かな?
仮にデッドロックしても検知機構働いてちゃんと落ちるし何が言いたいのか
594デフォルトの名無しさん
2022/09/06(火) 10:57:52.38ID:ItiT2cL1 >>588
その時代のことはよく知らないので
気になって調べてみたがwikipediaによると
2クロックで実行するという実装になっていた模様
なのでその時代に関しては128ビット幅のレジスタを使えるというアドバンテージしかなかったとのこと
その時代のことはよく知らないので
気になって調べてみたがwikipediaによると
2クロックで実行するという実装になっていた模様
なのでその時代に関しては128ビット幅のレジスタを使えるというアドバンテージしかなかったとのこと
595デフォルトの名無しさん
2022/09/06(火) 11:23:36.25ID:7Nc33VtP596デフォルトの名無しさん
2022/09/06(火) 14:37:15.63ID:ax+JnAgH 今回は実装の話だからサーバー上なら今どきは非同期で実装で合ってると思うよ
597デフォルトの名無しさん
2022/09/06(火) 16:35:51.33ID:E35zydsp >>596
文脈読めないおバカさんその2乙w
文脈読めないおバカさんその2乙w
598デフォルトの名無しさん
2022/09/06(火) 16:56:04.53ID:rOGll//o >>593
その通りだな、安易に実装できるものを標準で欲しがる理論がわからんわ
多くの言語のfutureなんてデータの結果受信同期待ちが起こるだけだし、goのcontext.WithTimeoutは
他の言語では全く実装できていないfutureのプラス機能のようなもので、goはより進んでいると言える
一方promise的なもの、つまり複数のgoroutineを束ねて制御したい人は、欲しい人もいるかもしれないが
goで書いたpipeline処理は手動で書くからこそきめ細かい制御が出来るので、無作為にこれとこれを並列、
これとこれを非同期だけど同期的に実行にしたいとか、効率を考えたらこの流れを組み替えられることには
ほとんど意味もないね。
例えばJSでPromise.allとかすべてを非同期並列に実行して成功の可否で分岐したいなんて、同じ状態が
goroutineとチャネル待ち受けで出来てしまうわけで、それを仰々しいライブラリにする意味が分からん
その通りだな、安易に実装できるものを標準で欲しがる理論がわからんわ
多くの言語のfutureなんてデータの結果受信同期待ちが起こるだけだし、goのcontext.WithTimeoutは
他の言語では全く実装できていないfutureのプラス機能のようなもので、goはより進んでいると言える
一方promise的なもの、つまり複数のgoroutineを束ねて制御したい人は、欲しい人もいるかもしれないが
goで書いたpipeline処理は手動で書くからこそきめ細かい制御が出来るので、無作為にこれとこれを並列、
これとこれを非同期だけど同期的に実行にしたいとか、効率を考えたらこの流れを組み替えられることには
ほとんど意味もないね。
例えばJSでPromise.allとかすべてを非同期並列に実行して成功の可否で分岐したいなんて、同じ状態が
goroutineとチャネル待ち受けで出来てしまうわけで、それを仰々しいライブラリにする意味が分からん
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国連大使「日本が中国に武力行使すると脅しをかけたのは初めて」 国連事務総長に書簡★4 [♪♪♪★]
- 台湾有事での集団的自衛権行使に「賛成」が48.8%、「反対」が44.2% ★8 [♪♪♪★]
- 【🐼】パンダ、日本で会えなくなる? 中国との関係悪化で不安の声 [ぐれ★]
- 【芸能】44歳・池脇千鶴、激変ぶりにネット衝撃 「まるで別人…」「変化が凄い!!」の声 [冬月記者★]
- 台湾有事での集団的自衛権行使に「賛成」が48.8%、「反対」が44.2% ★9 [♪♪♪★]
- なぜ立花孝志氏の言葉は信じられたのか…"異例の逮捕"が浮き彫りにした「SNSの危険な病理」 [ぐれ★]
- おい千晴😡
- ミカン高ミカンめっちゃたっかwwwwww
- 🏡😡
- お前らGoogleアンケートやってんの?
- おい、八田!
- 一番くじで後ろに転売ヤーが並んでいることに気付いたオタクが取った行動に👉スカッと10万いいね [329329848]
