Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。
公式
https://golang.org
公式ドキュメント
https://golang.org/doc/
公式外パッケージドキュメント
https://godoc.org
ブラウザ上で試し書き
https://play.golang.org
※前スレ
Go language part 3
https://mevius.5ch.net/test/read.cgi/tech/1571315884/
探検
Go language part 4
■ このスレッドは過去ログ倉庫に格納されています
2020/11/16(月) 04:14:40.64ID:fB5+0hxC
717デフォルトの名無しさん
2021/11/28(日) 11:07:43.63ID:Abxhe3pm >>715
そういえば脱線を嫌ってるのか?なら戻しておくと、
Goはgoroutineで並列平行をお気楽に書けるようにしたが、
並列は今のところasync/awaitで決まりなので、目論見は外れた。
平行は…async/awaitではなさそうだし、まあチャネルだろうし、goroutineかも?
そういえば脱線を嫌ってるのか?なら戻しておくと、
Goはgoroutineで並列平行をお気楽に書けるようにしたが、
並列は今のところasync/awaitで決まりなので、目論見は外れた。
平行は…async/awaitではなさそうだし、まあチャネルだろうし、goroutineかも?
718デフォルトの名無しさん
2021/11/28(日) 11:15:38.54ID:Abxhe3pm >>715
716(脱線側)補足
× > async/await自体もpromiseの実装だよ
○ async/awaitの実装の一つがpromise
async/awaitはただの記法であって、その実装にpromise方式も使える。
つまりasync/awaitの方が上位概念だよ。同一レイヤーではない。
716(脱線側)補足
× > async/await自体もpromiseの実装だよ
○ async/awaitの実装の一つがpromise
async/awaitはただの記法であって、その実装にpromise方式も使える。
つまりasync/awaitの方が上位概念だよ。同一レイヤーではない。
719デフォルトの名無しさん
2021/11/28(日) 11:16:48.98ID:7hiPfTRd >>714
Taskなしのasync/awaitだけじゃ並列処理できないんじゃないの?
Taskなしのasync/awaitだけじゃ並列処理できないんじゃないの?
720デフォルトの名無しさん
2021/11/28(日) 11:38:24.51ID:Abxhe3pm >>719
何で?
Jobを投げ込むのにTask型を使ってるだけで、要は関数のエントリポイントが有ればいいだけだし、実際JSはそうだろ。
> async function asyncCall() {
>
console.log('calling');
>
const result = await resolveAfter2Seconds();
> console.log(result);
>
// expected output: "resolved"
> }
>
asyncCall();
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
async/awaitが保証してるのは、
・async関数は非同期で実行される --- (A)
・awaitでメインスレッドは一旦処理が返る。その後、async関数が終わり次第続きを実行する。
であって、(A)をスレッドプールから実行するようにしたのがC#で、並列されるし、
そうしてないだけ、つまり非同期を同期的に書けるようにしただけなのがJSだろ。
だから逆に、JSでも(A)をWorkerスレッドに振るようにしたら並列するようになるだけだよ。
何で?
Jobを投げ込むのにTask型を使ってるだけで、要は関数のエントリポイントが有ればいいだけだし、実際JSはそうだろ。
> async function asyncCall() {
>
console.log('calling');
>
const result = await resolveAfter2Seconds();
> console.log(result);
>
// expected output: "resolved"
> }
>
asyncCall();
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
async/awaitが保証してるのは、
・async関数は非同期で実行される --- (A)
・awaitでメインスレッドは一旦処理が返る。その後、async関数が終わり次第続きを実行する。
であって、(A)をスレッドプールから実行するようにしたのがC#で、並列されるし、
そうしてないだけ、つまり非同期を同期的に書けるようにしただけなのがJSだろ。
だから逆に、JSでも(A)をWorkerスレッドに振るようにしたら並列するようになるだけだよ。
721デフォルトの名無しさん
2021/11/28(日) 11:56:27.00ID:7hiPfTRd awaitで待っている側はその間止まっているわけだから並行処理ではあっても並列処理じゃないでしょ。
まぁTask.WaitAllのように複数同時に投げられるようにするならそれでもいいだろうけど。
まぁTask.WaitAllのように複数同時に投げられるようにするならそれでもいいだろうけど。
722デフォルトの名無しさん
2021/11/28(日) 12:21:57.96ID:s59YsBRT async/await ってPromiseの糖衣構文にしか見えなくて大いに疑問が(知らないだけ?
糖衣構文で言語仕様を膨らませて、こんなに簡潔に書けるようになりました!とかもう子供かと
言語仕様が増えても出来ることが簡潔に書ける以外で変わらないんじゃ劣化してるだろ
簡潔にと言われるたびに信用を下げる
糖衣構文で言語仕様を膨らませて、こんなに簡潔に書けるようになりました!とかもう子供かと
言語仕様が増えても出来ることが簡潔に書ける以外で変わらないんじゃ劣化してるだろ
簡潔にと言われるたびに信用を下げる
723デフォルトの名無しさん
2021/11/28(日) 12:23:22.96ID:Abxhe3pm >>721
それは君のawaitの理解が間違ってる。
書いたとおり、awaitで「メインスレッドは一旦処理が返る」から、GUIも反応するんだよ。
メインスレッドはasync/awaitでは止まらない。
awaitでイベントループ(メッセージポンプ)に返されるだけ。
その後asyncが終了したら、awaitの続きから実行される。
この実装の一つとして、Promiseがある。でも動かすだけならforkで実装した方が多分簡単。
メインスレッドは止まってないのだから、asyncジョブはいくらでも「順次」投げられる。
(同時に投げる必要はない)
並列平行したければ好きなだけ投げ込めばいいだけ。
それは君のawaitの理解が間違ってる。
書いたとおり、awaitで「メインスレッドは一旦処理が返る」から、GUIも反応するんだよ。
メインスレッドはasync/awaitでは止まらない。
awaitでイベントループ(メッセージポンプ)に返されるだけ。
その後asyncが終了したら、awaitの続きから実行される。
この実装の一つとして、Promiseがある。でも動かすだけならforkで実装した方が多分簡単。
メインスレッドは止まってないのだから、asyncジョブはいくらでも「順次」投げられる。
(同時に投げる必要はない)
並列平行したければ好きなだけ投げ込めばいいだけ。
724デフォルトの名無しさん
2021/11/28(日) 12:45:46.64ID:s59YsBRT725デフォルトの名無しさん
2021/11/28(日) 12:56:29.36ID:s59YsBRT726デフォルトの名無しさん
2021/11/28(日) 12:59:08.05ID:Abxhe3pm >>722
簡単は正義だろ。
無駄に仕様が膨らんでいるのは、紆余曲折しすぎたからだ。
Promiseが便利だとされているのはPromise.all位で、つまりjoinだが、
今のasync/awaitはこれを直接的に解決する手段を提供してない。
だからここが何とかなれば、async/await以外は廃止方向だと思うぜ。今のままなら。
JSの場合はasync/awaitが見えてたのにPromise導入に踏み切った。
俺はあれは判断を間違えてると思うよ。
JSは仕様を廃止出来ないのだから、ムダ仕様を入れる度にオワコン化していくだけ。
逆に、バージョン管理してて仕様を廃止出来るC#は、実験場にも出来るし、今そうなってる感はあるけど、
本来ならもっと軽量級のGoやRubyで色々やるべきだったよね。
Goも登場時の2009にasync/await持ってればもっとメジャーになってたと思うよ。
goroutineも無いよりはましだけど、その程度でしかないから今こうなわけでさ。
簡単は正義だろ。
無駄に仕様が膨らんでいるのは、紆余曲折しすぎたからだ。
Promiseが便利だとされているのはPromise.all位で、つまりjoinだが、
今のasync/awaitはこれを直接的に解決する手段を提供してない。
だからここが何とかなれば、async/await以外は廃止方向だと思うぜ。今のままなら。
JSの場合はasync/awaitが見えてたのにPromise導入に踏み切った。
俺はあれは判断を間違えてると思うよ。
JSは仕様を廃止出来ないのだから、ムダ仕様を入れる度にオワコン化していくだけ。
逆に、バージョン管理してて仕様を廃止出来るC#は、実験場にも出来るし、今そうなってる感はあるけど、
本来ならもっと軽量級のGoやRubyで色々やるべきだったよね。
Goも登場時の2009にasync/await持ってればもっとメジャーになってたと思うよ。
goroutineも無いよりはましだけど、その程度でしかないから今こうなわけでさ。
727デフォルトの名無しさん
2021/11/28(日) 12:59:20.84ID:7hiPfTRd >>723
イベントループの存在が前提なのかな。
async/awaitではawaitで待っているTaskが内部でまたawait待ちになった時に
その制御を取得する手段がないから、そのイベントループ自体はasync/awaitとは
異なる機構で実現されてるってことかね。
イベントループの存在が前提なのかな。
async/awaitではawaitで待っているTaskが内部でまたawait待ちになった時に
その制御を取得する手段がないから、そのイベントループ自体はasync/awaitとは
異なる機構で実現されてるってことかね。
728デフォルトの名無しさん
2021/11/28(日) 13:14:08.57ID:xYHgZ8WY729デフォルトの名無しさん
2021/11/28(日) 13:18:18.69ID:Abxhe3pm >>727
そうだね。少なくともC#もJSもそう。ランタイムがある前提。
要は、asyncジョブが終わった時にメインスレッドをたたき起こす仕組みが必要なだけ。
GUIの場合はメインスレッドはイベントループを回ってるから、そこにイベントとして与えるのが一番簡単だし、そうしてるはず。
コンソールアプリだとイベントループはないので、ランタイム側にメインスレッドをたたき起こす仕組みを付加しないといけない。
けど、goでもこれはやれば出来るだけの話だよね。
そうだね。少なくともC#もJSもそう。ランタイムがある前提。
要は、asyncジョブが終わった時にメインスレッドをたたき起こす仕組みが必要なだけ。
GUIの場合はメインスレッドはイベントループを回ってるから、そこにイベントとして与えるのが一番簡単だし、そうしてるはず。
コンソールアプリだとイベントループはないので、ランタイム側にメインスレッドをたたき起こす仕組みを付加しないといけない。
けど、goでもこれはやれば出来るだけの話だよね。
730デフォルトの名無しさん
2021/11/28(日) 13:26:20.41ID:3qnAFeGl731デフォルトの名無しさん
2021/11/28(日) 13:28:24.24ID:Z9Xk/5kf async/awaitが使われていると、コードのいろんな箇所がどんどんノンブロッキングになっていく傾向がある気がしていて、
多くの人にとってかなり使い心地が良いんだろうな、と思ってる
俺はチャネルとgoroutine好きだけど、よく考えるとみんなうまく使えてないんだよなあ・・・
多くの人にとってかなり使い心地が良いんだろうな、と思ってる
俺はチャネルとgoroutine好きだけど、よく考えるとみんなうまく使えてないんだよなあ・・・
732デフォルトの名無しさん
2021/11/28(日) 13:32:08.20ID:p4O5g5oI > 俺はチャネルとgoroutine好きだけど、よく考えるとみんなうまく使えてないんだよなあ・・・
太田道灌
太田道灌
733デフォルトの名無しさん
2021/11/28(日) 13:35:20.14ID:Abxhe3pm >>730
出来るのは分かるが、使い道がないんだよ。
俺もPromiseは要は予約を積んでるだけなので無限に動的に積んで色々出来るか?と思った事はあった。
async/awaitはその点ハードコードだからそのルーチンしか処理しないし、狭い範囲で確定的だ。
ただな、Promiseに動的にいろんな場所からPromiseを積み重ねないといけないような状況はないんだ。
単にasync/awaitでまっすぐ書くだけで十分なんだよ。
出来るのは分かるが、使い道がないんだよ。
俺もPromiseは要は予約を積んでるだけなので無限に動的に積んで色々出来るか?と思った事はあった。
async/awaitはその点ハードコードだからそのルーチンしか処理しないし、狭い範囲で確定的だ。
ただな、Promiseに動的にいろんな場所からPromiseを積み重ねないといけないような状況はないんだ。
単にasync/awaitでまっすぐ書くだけで十分なんだよ。
734デフォルトの名無しさん
2021/11/28(日) 13:37:04.91ID:xYHgZ8WY ダメだ完全に発狂しとる
735デフォルトの名無しさん
2021/11/28(日) 13:39:44.17ID:Abxhe3pm >>731
> 俺はチャネルとgoroutine好きだけど、よく考えるとみんなうまく使えてないんだよなあ・・・
ならお前が上手く使ってる例を布教すればいいだけ。
それが凄く有用で、現行のasync/awaitやPromiseでは実現出来ないものであれば、
Goスゲーって事になるだけ。
JSも2005にXHRが再発見されるまではオモチャ扱いだったし、ワンチャンはあるぞ。
> 俺はチャネルとgoroutine好きだけど、よく考えるとみんなうまく使えてないんだよなあ・・・
ならお前が上手く使ってる例を布教すればいいだけ。
それが凄く有用で、現行のasync/awaitやPromiseでは実現出来ないものであれば、
Goスゲーって事になるだけ。
JSも2005にXHRが再発見されるまではオモチャ扱いだったし、ワンチャンはあるぞ。
736デフォルトの名無しさん
2021/11/28(日) 14:03:02.10ID:cigmxKA5 >>733
めちゃくちゃ使うよ。
既にメモ化されたデータがあればそれを使う、そこに無ければ動的にイベントハンドラー仕掛けておいて、一定時間内にそのイベントが発火したならそのイベントの引数を返すが、発火しなければrejectする、みたいな。
async/awaitしか使わない、CPUをきちんと解放しろ、と言う話なら、Goならランタイムが自動的にやるので気にせず同期型のように書いて良いぞ。
めちゃくちゃ使うよ。
既にメモ化されたデータがあればそれを使う、そこに無ければ動的にイベントハンドラー仕掛けておいて、一定時間内にそのイベントが発火したならそのイベントの引数を返すが、発火しなければrejectする、みたいな。
async/awaitしか使わない、CPUをきちんと解放しろ、と言う話なら、Goならランタイムが自動的にやるので気にせず同期型のように書いて良いぞ。
737デフォルトの名無しさん
2021/11/28(日) 14:08:56.82ID:Abxhe3pm >>736
よく分からんからコードで頼む。
君のコードでなくてもいいし、誰かのGitHubでもいいので。
要はその、Promiseでは簡単に出来るが、async/awaitでは無理(または複雑になる)、っていうコードを。
よく分からんからコードで頼む。
君のコードでなくてもいいし、誰かのGitHubでもいいので。
要はその、Promiseでは簡単に出来るが、async/awaitでは無理(または複雑になる)、っていうコードを。
738デフォルトの名無しさん
2021/11/28(日) 14:10:43.62ID:Z9Xk/5kf >>735
おれの知識はほぼほぼ「Go言語による並行処理」だから、これを読め、で終わってしまう・・・
おれの知識はほぼほぼ「Go言語による並行処理」だから、これを読め、で終わってしまう・・・
739デフォルトの名無しさん
2021/11/28(日) 14:37:47.26ID:VtXew58l >>737
この説明でわからなければ、どーせメリットもわかんないだろうから「めんどくさいコード書くな」で終わるでしょw
実際に使ってる自分のリポジトリ晒すのもアホだし、Zennの記事はっとくわ。
https://zenn.dev/uzimaru0000/scraps/b4445cfed8f42f
この説明でわからなければ、どーせメリットもわかんないだろうから「めんどくさいコード書くな」で終わるでしょw
実際に使ってる自分のリポジトリ晒すのもアホだし、Zennの記事はっとくわ。
https://zenn.dev/uzimaru0000/scraps/b4445cfed8f42f
740デフォルトの名無しさん
2021/11/28(日) 14:39:55.58ID:VtXew58l741デフォルトの名無しさん
2021/11/28(日) 14:44:16.89ID:cigmxKA5 async/await(だけ)では面倒で、Promiseと可換だからこそ便利だ、と言ってるんよ。
C#でも皆に臨まれてTask Likeな自作クラスが作れるようになったわけだが、いかんせん大袈裟な作りがいる。
C#でも皆に臨まれてTask Likeな自作クラスが作れるようになったわけだが、いかんせん大袈裟な作りがいる。
742デフォルトの名無しさん
2021/11/28(日) 18:42:46.20ID:Abxhe3pm >>739-741
うん、分からんね。ただ君の説
> Promiseと可換だからこそ便利だ
についてはC#はそうなってないからじきに結果は出るだろう。
とはいえヘルスバーグは知っててPromiseは不要だと判断したのだし、俺もそう思えるのだけど。
(ヘルスバーグについてはインタビューがあったはずだがググっても出てこない)
一応各URL内容に対し回答しておくと、
> await click().then(click).then(click)
については、
await click();
await click();
await click();
で、すさまじく馬鹿っぽい事以外の問題点はない。
> 遅れてのセット…Promise#thenはresolve前でもresolve後でも問題なく動く
についてはまあそうなんだけど、これはどちらかというとonload系イベントの問題で、
この方法でも根っこの部分、つまり最初のPromiseを設定する時点で既に onload 済みなら発行されない問題が解決出来ておらず、
結局ユーザー側が onload 済みかチェックする、または絶対に onload 未発行の時点で実行する必要がある。
だから onload 系のイベントが最初から全部 Promise だったら綺麗に解決してたのだろうけど、実際そうじゃないので言うほど利益がない。
Promiseが残るか自前でonload発行をチェックしたフラグが残るか程度だ。
> 複数の条件…Promise.allで取れる
これはその通りなのだけど、馬鹿っぽくてよければ同様に await 縦積み、
await sumefuncA();
await sumefuncB();
await sumefuncC();
で行ける。(C#はこれでいけるはず。JSはもしかしたら駄目かも)
うん、分からんね。ただ君の説
> Promiseと可換だからこそ便利だ
についてはC#はそうなってないからじきに結果は出るだろう。
とはいえヘルスバーグは知っててPromiseは不要だと判断したのだし、俺もそう思えるのだけど。
(ヘルスバーグについてはインタビューがあったはずだがググっても出てこない)
一応各URL内容に対し回答しておくと、
> await click().then(click).then(click)
については、
await click();
await click();
await click();
で、すさまじく馬鹿っぽい事以外の問題点はない。
> 遅れてのセット…Promise#thenはresolve前でもresolve後でも問題なく動く
についてはまあそうなんだけど、これはどちらかというとonload系イベントの問題で、
この方法でも根っこの部分、つまり最初のPromiseを設定する時点で既に onload 済みなら発行されない問題が解決出来ておらず、
結局ユーザー側が onload 済みかチェックする、または絶対に onload 未発行の時点で実行する必要がある。
だから onload 系のイベントが最初から全部 Promise だったら綺麗に解決してたのだろうけど、実際そうじゃないので言うほど利益がない。
Promiseが残るか自前でonload発行をチェックしたフラグが残るか程度だ。
> 複数の条件…Promise.allで取れる
これはその通りなのだけど、馬鹿っぽくてよければ同様に await 縦積み、
await sumefuncA();
await sumefuncB();
await sumefuncC();
で行ける。(C#はこれでいけるはず。JSはもしかしたら駄目かも)
743デフォルトの名無しさん
2021/11/28(日) 19:04:46.48ID:Abxhe3pm 742最後補足&訂正
JSの場合も縦積みは出来るが書き方が違うようだ。
(というかC#も間違えていたので書き直すと)
await someAsyncFuncA;
await someAsyncFuncB;
await someAsyncFuncC;
となる。以下は https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function より。(720で貼り損なったので)
async function concurrentStart() {
console.log('==CONCURRENT START with await==');
const slow = resolveAfter2Seconds() // ただちにタイマーを起動
const fast = resolveAfter1Second() // ただちにタイマーを起動
// 1. これは即時実行される
console.log(await slow) // 2. これは 1. の 2 秒後に実行される
console.log(await fast) // 3. fast はすでに解決しているので、これは 1. の 2 秒後 (2.の直後) に実行される
}
JSの場合も縦積みは出来るが書き方が違うようだ。
(というかC#も間違えていたので書き直すと)
await someAsyncFuncA;
await someAsyncFuncB;
await someAsyncFuncC;
となる。以下は https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function より。(720で貼り損なったので)
async function concurrentStart() {
console.log('==CONCURRENT START with await==');
const slow = resolveAfter2Seconds() // ただちにタイマーを起動
const fast = resolveAfter1Second() // ただちにタイマーを起動
// 1. これは即時実行される
console.log(await slow) // 2. これは 1. の 2 秒後に実行される
console.log(await fast) // 3. fast はすでに解決しているので、これは 1. の 2 秒後 (2.の直後) に実行される
}
744デフォルトの名無しさん
2021/11/28(日) 20:06:47.00ID:s59YsBRT 推してる癖に間違えるくらい千差万別なのね
745デフォルトの名無しさん
2021/11/28(日) 20:25:18.89ID:Abxhe3pm746デフォルトの名無しさん
2021/11/28(日) 20:31:19.41ID:AhuL0Pkx >>710
一回だけ使うはずなのを二回以上使うと不具合があるのが問題とか言い出したら
副作用のある関数の呼び出しも問題ってことになるよな
「単一の結果の生成をもって完了するというセマンティクス」というのもないし
一回だけ使うはずなのを二回以上使うと不具合があるのが問題とか言い出したら
副作用のある関数の呼び出しも問題ってことになるよな
「単一の結果の生成をもって完了するというセマンティクス」というのもないし
747デフォルトの名無しさん
2021/11/28(日) 20:36:54.41ID:Xc/smr1I まあゴル同士で複雑なハンドシェイク的な値のやり取りはしない方が良いね
少なくとも俺はバッドパーツ認定してる
結果をkey-value storeに吐くとかそういう使い方しかしてない
少なくとも俺はバッドパーツ認定してる
結果をkey-value storeに吐くとかそういう使い方しかしてない
748デフォルトの名無しさん
2021/11/28(日) 22:35:18.85ID:igoyS+tp749デフォルトの名無しさん
2021/11/28(日) 23:26:53.57ID:m82RP4Nz750デフォルトの名無しさん
2021/11/29(月) 00:36:52.64ID:M92LX90q C#おじさんの大暴れ回
751デフォルトの名無しさん
2021/11/29(月) 02:15:08.24ID:JPr9HHY7 >>742
C#もそうなりましたが…。
https://qiita.com/inasync/items/6417933e258b53b5bbd3
こっちでは似たような事やってるね。
https://www.buildinsider.net/column/iwanaga-nobuyuki/009
あんまり知らんだけでは?
C#もそうなりましたが…。
https://qiita.com/inasync/items/6417933e258b53b5bbd3
こっちでは似たような事やってるね。
https://www.buildinsider.net/column/iwanaga-nobuyuki/009
あんまり知らんだけでは?
752デフォルトの名無しさん
2021/11/29(月) 09:11:23.82ID:kiCwAGEX >>749
それはその通りで、一般論として、副作用のない関数より副作用のある関数のほうが相対的にはクソだろ?
本来副作用の必要がない場合でも常に副作用のある関数として実装しなければならないとしたら、本来例えば半分程度で済むはずが全てクソ関数になっちゃうじゃん
それがchannel
それはその通りで、一般論として、副作用のない関数より副作用のある関数のほうが相対的にはクソだろ?
本来副作用の必要がない場合でも常に副作用のある関数として実装しなければならないとしたら、本来例えば半分程度で済むはずが全てクソ関数になっちゃうじゃん
それがchannel
753デフォルトの名無しさん
2021/11/29(月) 11:31:15.42ID:Ulxk0pae まあGoの設計思想的としてはそもそも非同期関数を作っちゃいけないんだろうな
常に非同期で使用することが明らかな場合でもchannelを引数に取るような関数をパッケージ外に公開するような設計はすべきじゃなくて、
普通に同期関数にしといて使う側で必要に応じてgoroutine使えということなんだろう
常に非同期で使用することが明らかな場合でもchannelを引数に取るような関数をパッケージ外に公開するような設計はすべきじゃなくて、
普通に同期関数にしといて使う側で必要に応じてgoroutine使えということなんだろう
754デフォルトの名無しさん
2021/11/29(月) 12:15:00.68ID:ofvG7nI/ え?goroutineにチャネル渡さなけりゃクロージャで渡すしかないから共通関数にできんし
ちょっと何を言ってるのか分かりませんね
ちょっと何を言ってるのか分かりませんね
755デフォルトの名無しさん
2021/11/29(月) 12:15:45.71ID:ofvG7nI/ 外部関数
756デフォルトの名無しさん
2021/11/29(月) 12:23:12.94ID:ofvG7nI/ ツアーでもチャネル渡すコーディングしてるよ
https://go-tour-jp.appspot.com/concurrency/2
https://go-tour-jp.appspot.com/concurrency/2
757デフォルトの名無しさん
2021/11/29(月) 12:35:27.53ID:O0SZji1w tourはあくまで機能の紹介だろ。
hello worldを実務で書くか?
channelの何が気に食わんの?デッドロックするところ?
別に後続の関数投げても良いんだぞ。
hello worldを実務で書くか?
channelの何が気に食わんの?デッドロックするところ?
別に後続の関数投げても良いんだぞ。
758デフォルトの名無しさん
2021/11/29(月) 12:39:01.25ID:g6qk7DwE759デフォルトの名無しさん
2021/11/29(月) 12:46:47.06ID:ofvG7nI/ 標準のライブラリは低レベル機能しか持たせてないじゃん
だからといって、非同期に使うことは好ましくないという設計思想だとかかなり無理があるだろ
ツアーは基本的な使い方のサンプルなんだから、基本的に非同期で動かす関数を書くにはチャネルを渡しましょう!と大々的に宣言してる証拠じゃないのか?
だからといって、非同期に使うことは好ましくないという設計思想だとかかなり無理があるだろ
ツアーは基本的な使い方のサンプルなんだから、基本的に非同期で動かす関数を書くにはチャネルを渡しましょう!と大々的に宣言してる証拠じゃないのか?
760デフォルトの名無しさん
2021/11/29(月) 13:18:56.71ID:rw4mU1bL まだやってた
761デフォルトの名無しさん
2021/11/29(月) 13:51:14.56ID:DbScqZpC 好きだよね〜
762デフォルトの名無しさん
2021/11/29(月) 14:19:10.41ID:O40DgaQc >>752
>本来副作用の必要がない場合でも常に副作用のある関数として実装しなければならないとしたら
そんなのがどこから出てきたんだか。
呼び出すべきじゃないところで誤って呼び出すと不具合があるからクソだと言い出すなら
入出力とか、副作用を持つ関数もクソということになるって話だがな
戻り値を変数に入れて置けば良いだけなのにそれを出来ずに
2回呼び出すと不具合が起こると文句を言ってるんだよな
>本来副作用の必要がない場合でも常に副作用のある関数として実装しなければならないとしたら
そんなのがどこから出てきたんだか。
呼び出すべきじゃないところで誤って呼び出すと不具合があるからクソだと言い出すなら
入出力とか、副作用を持つ関数もクソということになるって話だがな
戻り値を変数に入れて置けば良いだけなのにそれを出来ずに
2回呼び出すと不具合が起こると文句を言ってるんだよな
763デフォルトの名無しさん
2021/11/29(月) 16:44:46.78ID:M92LX90q チャネルが理解できないC#おじさんがID変えて自己弁護しながら暴れてるだけ
>>752
「副作用のない関数より副作用のある関数のほうが相対的にはクソ」
一般的には手続き型言語であればサイドエフェクトがある関数が普通で、純関数言語のようなほとんど副作用の
無い関数などはI/O処理などでビックロックなどで誤魔化してるに過ぎない。
>>753
そもそもGoは全部が非同期・並列だから逆。メインでさえgoroutineの1つで、デフォルトでGOMAXPROCS
「channelを引数に取るような関数をパッケージ外に公開するような設計はすべきじゃなく」これも逆です。
structには本来はchannelやcontextを含めるべきではなく、引数に取ることが推奨されている
>>759
「標準のライブラリは低レベル機能しか持たせてない」最近の言語は、標準のライブラリという重大なクソを
薄く小さくするのが流行り、なぜなら稚拙な標準のライブラリをリリースしてしまい、後からもっと効率的で
理論に裏付けされたライブラリが出てくる。そしてクソな標準が互換性のために直せない。薄くて小さい
ライブラリは速く、メンテナンスも容易で、依存性も少ない。
逆に、標準のライブラリに重厚長大を求めるのは何かが間違ってる。チャネルを渡すことを使う事を禁忌したい
気持ちが奥底にあるから「証拠」なんて言葉が出てくる。Tourなどのパイプライン処理とかを見ればチャネルを
受け渡すことの効率性と高い非依存が良くわかる。aync系の言語でやろうとしたらミューテックスでロックして
処理の終わりでwaitしてなど極めて並列度が低く、依存性が高く、ゴミのような自己満足が広がる
だから遅くて成果物はデカい
>>752
「副作用のない関数より副作用のある関数のほうが相対的にはクソ」
一般的には手続き型言語であればサイドエフェクトがある関数が普通で、純関数言語のようなほとんど副作用の
無い関数などはI/O処理などでビックロックなどで誤魔化してるに過ぎない。
>>753
そもそもGoは全部が非同期・並列だから逆。メインでさえgoroutineの1つで、デフォルトでGOMAXPROCS
「channelを引数に取るような関数をパッケージ外に公開するような設計はすべきじゃなく」これも逆です。
structには本来はchannelやcontextを含めるべきではなく、引数に取ることが推奨されている
>>759
「標準のライブラリは低レベル機能しか持たせてない」最近の言語は、標準のライブラリという重大なクソを
薄く小さくするのが流行り、なぜなら稚拙な標準のライブラリをリリースしてしまい、後からもっと効率的で
理論に裏付けされたライブラリが出てくる。そしてクソな標準が互換性のために直せない。薄くて小さい
ライブラリは速く、メンテナンスも容易で、依存性も少ない。
逆に、標準のライブラリに重厚長大を求めるのは何かが間違ってる。チャネルを渡すことを使う事を禁忌したい
気持ちが奥底にあるから「証拠」なんて言葉が出てくる。Tourなどのパイプライン処理とかを見ればチャネルを
受け渡すことの効率性と高い非依存が良くわかる。aync系の言語でやろうとしたらミューテックスでロックして
処理の終わりでwaitしてなど極めて並列度が低く、依存性が高く、ゴミのような自己満足が広がる
だから遅くて成果物はデカい
764デフォルトの名無しさん
2021/11/29(月) 19:32:28.88ID:TPDpg4yk まぁまぁ、顔真っ赤にして投稿するのやめよ?落ち着こうな
765デフォルトの名無しさん
2021/11/29(月) 20:00:58.25ID:rw4mU1bL 昨日からなにが言いたいのかさっぱり
自分でも頭おかしくなってるんだろうか
自分でも頭おかしくなってるんだろうか
766デフォルトの名無しさん
2021/12/20(月) 18:58:52.11ID:S0D0uK3y Go 1.18 Beta 1 is available, with generics, 14 December 2021
767デフォルトの名無しさん
2022/01/07(金) 00:14:05.77ID:l4f7h5d/ ちょっとかじってみたニワカの感想なんだけど
Go言語ってBetter Cって感じだな。
Go言語ってBetter Cって感じだな。
768デフォルトの名無しさん
2022/01/07(金) 00:38:05.83ID:j/jugqL+769デフォルトの名無しさん
2022/02/06(日) 12:21:06.60ID:SQRLIZAc GoのジェネリックがGo 1.18 Beta 1でデビュー
https://www.infoq.com/jp/news/2022/01/go-generics-beta/
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V
type Number interface { int64 | float64 }
https://www.infoq.com/jp/news/2022/01/go-generics-beta/
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V
type Number interface { int64 | float64 }
770デフォルトの名無しさん
2022/02/07(月) 09:14:37.90ID:YCtDYJO4 お前らが煩いから…
771デフォルトの名無しさん
2022/02/19(土) 10:13:03.12ID:AG6SdX6W 最近goよりrustが気になってきた
コンパイラ型の早いモダンな言語ということで安易にgoやってたけど
rustにすべきだったか
コンパイラ型の早いモダンな言語ということで安易にgoやってたけど
rustにすべきだったか
772デフォルトの名無しさん
2022/02/19(土) 11:35:19.56ID:R5yjbcGL rustは学習時間がかかる
773デフォルトの名無しさん
2022/02/19(土) 13:51:37.16ID:u5oa6W2x 利用範囲というか得意範囲が違うから興味はない
まして癖が強いんで覚えなきゃならんことが多すぎる
出始めのJavaより癖が強くないかあれは
今は皆が馴染んだけどJavaのIO周りとか、解らねぇ!という声が多かった記憶
だから少なくとも10年は待つのが正解
まして癖が強いんで覚えなきゃならんことが多すぎる
出始めのJavaより癖が強くないかあれは
今は皆が馴染んだけどJavaのIO周りとか、解らねぇ!という声が多かった記憶
だから少なくとも10年は待つのが正解
774デフォルトの名無しさん
2022/02/19(土) 15:23:37.32ID:AlOKsuc0 >>771
用途が違うんだから、両方やればよろし
用途が違うんだから、両方やればよろし
775デフォルトの名無しさん
2022/02/19(土) 16:39:42.26ID:lVeS0ElI Goは向いている適用範囲が狭い
他の言語も併用せざるをえない
他の言語も併用せざるをえない
776デフォルトの名無しさん
2022/02/19(土) 19:00:07.51ID:ZkbC0IWU それでいいんだよ
777デフォルトの名無しさん
2022/02/19(土) 23:50:48.59ID:xGD28DxW Go 1.18 Release Candidate 1 is released 2022/02/18 2:04:17 (昨日)
https://groups.google.com/g/golang-announce/c/QHL1fTc352o/m/5sE6moURBwAJ
https://groups.google.com/g/golang-announce/c/QHL1fTc352o/m/5sE6moURBwAJ
778デフォルトの名無しさん
2022/02/20(日) 11:21:21.17ID:VbAVfRtD > 早いモダンな言語
速くもないしモダンでもない
速くもないしモダンでもない
779デフォルトの名無しさん
2022/02/20(日) 12:17:41.07ID:1fyiha6j 1.18 finalは3月に持ち越しか
780デフォルトの名無しさん
2022/02/20(日) 12:35:50.50ID:coxlbRTF 単体のマシンで並列処理をひたすらに行うという涙ぐましい用途特化よね
無駄金がありゃ分散化してロードバランサ使ってしのぐと思う
無駄金がありゃ分散化してロードバランサ使ってしのぐと思う
781デフォルトの名無しさん
2022/02/20(日) 13:24:25.85ID:QnKhevyf Goは並列処理が書きやすい簡単な静的型付け言語って感じよな
Goの文法はモダンとはとても言えないけど、わりと早いビルド、gitとの連携、fmt、とかもろもろのエコシステムを総じて言えばモダンと呼べそうではある
逆に、例えばD言語は文法が良いのにエコシステムがウンコだったから人気出なかったんだと思う
Goの文法はモダンとはとても言えないけど、わりと早いビルド、gitとの連携、fmt、とかもろもろのエコシステムを総じて言えばモダンと呼べそうではある
逆に、例えばD言語は文法が良いのにエコシステムがウンコだったから人気出なかったんだと思う
782デフォルトの名無しさん
2022/02/20(日) 15:45:27.00ID:coxlbRTF 分散しないでも程よく性能が出るって点から、ネットワーク関係の組み込み機器(ルータとか)に向いてるような気もする(気がするだけ)んだけど、特に席巻してるとも聞かないから使われてないのかな
783デフォルトの名無しさん
2022/02/20(日) 15:47:35.30ID:coxlbRTF busybox的な作りならメモリも圧迫しないだろという考え
784デフォルトの名無しさん
2022/02/20(日) 18:28:36.22ID:VbAVfRtD >>782
ルータの中身なんてlinuxでCだろ
組み込みはCPUパワーと消費電力に厳しいのでC以外に現実的に解がない
逆に言えば、C以外で組んだ時には価格と消費電力でその商品に訴求力が無くなる
Cでは実現不可能な程のファームウェアアップデートの頻度が必要な商品もないだろ
ルータの中身なんてlinuxでCだろ
組み込みはCPUパワーと消費電力に厳しいのでC以外に現実的に解がない
逆に言えば、C以外で組んだ時には価格と消費電力でその商品に訴求力が無くなる
Cでは実現不可能な程のファームウェアアップデートの頻度が必要な商品もないだろ
785デフォルトの名無しさん
2022/02/20(日) 18:35:18.72ID:Y1MJvTk4 Google的には組み込み向けはFlutter/Dart
786デフォルトの名無しさん
2022/02/20(日) 18:37:32.10ID:VbAVfRtD >>781
goroutineが正解だと間違えた失敗言語だろ
このチャレンジ自体は良い事だが、正解はasyncだった
複雑になりすぎたC++を嫌い、またWeb系での最速を求めた連中はRustに行った
型を知らなかったWeb系の馬鹿共には丁度良かったが、そいつらはTSに行った
ast木がデフォで出るのは面白いが、あれはプログラマ的にはレベルが低すぎて使えない(自前で正規表現でやるよりはまし程度でしかない)
ならいっそのことあれこれやりまくる実験言語にしてもいいとは思うが、仕様の追加は他言語と比べても遅い
現在新規でGoをやる意味はないから、あとは廃れるだけだろ
goroutineが正解だと間違えた失敗言語だろ
このチャレンジ自体は良い事だが、正解はasyncだった
複雑になりすぎたC++を嫌い、またWeb系での最速を求めた連中はRustに行った
型を知らなかったWeb系の馬鹿共には丁度良かったが、そいつらはTSに行った
ast木がデフォで出るのは面白いが、あれはプログラマ的にはレベルが低すぎて使えない(自前で正規表現でやるよりはまし程度でしかない)
ならいっそのことあれこれやりまくる実験言語にしてもいいとは思うが、仕様の追加は他言語と比べても遅い
現在新規でGoをやる意味はないから、あとは廃れるだけだろ
787デフォルトの名無しさん
2022/02/20(日) 20:11:46.12ID:uXMwiVcI web系のバックエンドである程度速度求める層には使われてくんじゃないかな。楽だもん。
個人的にはnull安全じゃない点でもういいやって感じだけど。
個人的にはnull安全じゃない点でもういいやって感じだけど。
788デフォルトの名無しさん
2022/02/20(日) 21:46:42.94ID:VbAVfRtD >>787
> ある程度速度求める層
これは基本的にない。
速度が問題になると分かっていて、チームがRustを使える場合、100%Rustを選択する。
Rustが使えない場合、今現在の第一選択肢はTSだろ。
そこそこ速いし、最悪はJSエンジニアを流用可能だし、全く新規に教育するにしてもフロントエンドでも使えるし。
Web系の現場でGoをわざわざ教育する意味はない。
(飽和した市場においては)商品は尖ってないといけないとよく言われるが、Goは今現在尖ってないんだよ。
速度が欲しくてガッツリ組みたければC#でもいいし、実際にASP.NETのシェアは7.9%でPHPに次ぐ第2位だ。(なおGoは0.0007%、Rustはそれ以下)
https://w3techs.com/technologies/overview/programming_language
TSよりはGoが速いのも事実ではあるが、
https://atmarkit.itmedia.co.jp/ait/articles/1909/13/news133.html
googleがrubyを切った時のようにチーム内で言語を統一するなら、今ならJSかTSになる。Goはあり得ない。
今現在もシェアが低い=使える奴が少ないのだから、このままだと数多のマイナー言語と同様にポシャって終わり。
バックエンドで速度を求める際、最速はRustだけど、これが嫌ならC#で、ここで終わってしまう。
C#の駄目な点は仕様が重量級で勉強するのが大変な事位で、速度も安全性も生産性もGo以上だから。
Goは、速度がある程度必要だが最速である必要はなく、RustやC#は絶対に勉強したくない層向けになるが、これは現実的に無い。
> ある程度速度求める層
これは基本的にない。
速度が問題になると分かっていて、チームがRustを使える場合、100%Rustを選択する。
Rustが使えない場合、今現在の第一選択肢はTSだろ。
そこそこ速いし、最悪はJSエンジニアを流用可能だし、全く新規に教育するにしてもフロントエンドでも使えるし。
Web系の現場でGoをわざわざ教育する意味はない。
(飽和した市場においては)商品は尖ってないといけないとよく言われるが、Goは今現在尖ってないんだよ。
速度が欲しくてガッツリ組みたければC#でもいいし、実際にASP.NETのシェアは7.9%でPHPに次ぐ第2位だ。(なおGoは0.0007%、Rustはそれ以下)
https://w3techs.com/technologies/overview/programming_language
TSよりはGoが速いのも事実ではあるが、
https://atmarkit.itmedia.co.jp/ait/articles/1909/13/news133.html
googleがrubyを切った時のようにチーム内で言語を統一するなら、今ならJSかTSになる。Goはあり得ない。
今現在もシェアが低い=使える奴が少ないのだから、このままだと数多のマイナー言語と同様にポシャって終わり。
バックエンドで速度を求める際、最速はRustだけど、これが嫌ならC#で、ここで終わってしまう。
C#の駄目な点は仕様が重量級で勉強するのが大変な事位で、速度も安全性も生産性もGo以上だから。
Goは、速度がある程度必要だが最速である必要はなく、RustやC#は絶対に勉強したくない層向けになるが、これは現実的に無い。
789デフォルトの名無しさん
2022/02/20(日) 22:04:59.75ID:uXMwiVcI >>788
なるほどね。
なるほどね。
790デフォルトの名無しさん
2022/02/20(日) 22:33:50.88ID:uSEnVnLU791デフォルトの名無しさん
2022/02/20(日) 22:37:24.33ID:x/Ldx69r Rustが使えない場合で、かつ速度が必要な場合にTS使う訳無いだろ。
C#はわかるが。
マルチコアに弱すぎるわ。
C#ではなくGo選ぶケースってのはGoならではのメリットがあるシーンが多い。
C#はわかるが。
マルチコアに弱すぎるわ。
C#ではなくGo選ぶケースってのはGoならではのメリットがあるシーンが多い。
792デフォルトの名無しさん
2022/02/20(日) 23:21:45.49ID:VbAVfRtD >>791
> Goならではのメリット
だからそれは何?って話だろ。
C#で駄目でGoってのは学習コストくらいだが、学習コストが問題ならWeb系ならTS/JSで決まりだよ。
Goはgoroutineかgo generateが大当たりすれば良かったが、そうでない以上、C#に勝てる仕様がない。
現在シェアでボロ負けしてて光る仕様もなければ、このまま沈没以外にない。
Rustを考えれば分かりやすいが、シェアでボロ負けしててもC#に速度で勝てるし、
安全性も一応最高を目指してるから、選ぶ理由はあるだろ。
GoはRustが出てきた時に身の振り方を考えなければならなかったんだよ。
> Goならではのメリット
だからそれは何?って話だろ。
C#で駄目でGoってのは学習コストくらいだが、学習コストが問題ならWeb系ならTS/JSで決まりだよ。
Goはgoroutineかgo generateが大当たりすれば良かったが、そうでない以上、C#に勝てる仕様がない。
現在シェアでボロ負けしてて光る仕様もなければ、このまま沈没以外にない。
Rustを考えれば分かりやすいが、シェアでボロ負けしててもC#に速度で勝てるし、
安全性も一応最高を目指してるから、選ぶ理由はあるだろ。
GoはRustが出てきた時に身の振り方を考えなければならなかったんだよ。
793デフォルトの名無しさん
2022/02/20(日) 23:56:31.79ID:KcoG54wC794デフォルトの名無しさん
2022/02/21(月) 00:13:42.23ID:lBTJyZA6795デフォルトの名無しさん
2022/02/21(月) 00:16:41.00ID:GbKjQqyn >>793
詰まるって何が?
これ?なら仕様を知らないだけだね
https://oita.oika.me/2016/02/18/task-and-threadpool/
まあいずれにしても、C#で問題があれば、速攻対策されるよ
詰まるって何が?
これ?なら仕様を知らないだけだね
https://oita.oika.me/2016/02/18/task-and-threadpool/
まあいずれにしても、C#で問題があれば、速攻対策されるよ
796デフォルトの名無しさん
2022/02/21(月) 00:26:24.14ID:GbKjQqyn あとこんなんも出てきた
https://www.rox-note.tech/?p=30
まあスレッドプールはそういう設計なのだから、デフォで問題ない使い方をしないのなら自前で設定してやらないと駄目だね。
でもスレッドプールはプールであって、goroutineみたいにスレッド占有(スタック保持)ではないので、
動いてないスレッドはプールに返されて結果的にCPUは最速で動くはずだけど。
https://www.rox-note.tech/?p=30
まあスレッドプールはそういう設計なのだから、デフォで問題ない使い方をしないのなら自前で設定してやらないと駄目だね。
でもスレッドプールはプールであって、goroutineみたいにスレッド占有(スタック保持)ではないので、
動いてないスレッドはプールに返されて結果的にCPUは最速で動くはずだけど。
797デフォルトの名無しさん
2022/02/21(月) 01:57:33.27ID:889Qm57n 長時間、膨大なタスクを動かしたいんだよ。
798デフォルトの名無しさん
2022/02/21(月) 01:57:59.42ID:889Qm57n Go使う前はErlang使ってた案件。
799デフォルトの名無しさん
2022/02/21(月) 02:23:44.32ID:YbXysJZO C#ってサーバというかバックエンドで使えるのか
知らなかった
知らなかった
800デフォルトの名無しさん
2022/02/21(月) 03:00:09.00ID:lBTJyZA6801デフォルトの名無しさん
2022/02/21(月) 03:32:12.85ID:zbwL0D6l goroutineが理解できないC#おじさんがのC#のasyncで騒いでるだけ
こいつは数多くの言語が採用してるchannelの原理も理解できない。
こいつは数多くの言語が採用してるchannelの原理も理解できない。
802デフォルトの名無しさん
2022/02/21(月) 08:43:31.09ID:889Qm57n803デフォルトの名無しさん
2022/02/21(月) 08:44:21.18ID:889Qm57n804デフォルトの名無しさん
2022/02/21(月) 17:01:09.43ID:GbKjQqyn >>802
まず、論理CPU数よりも多いスレッドを立ち上げても余計に遅くなる。
だから長時間膨大なタスクの結果を最速で得るためには、
論理CPU数と同じスレッド数で順に処理する事であり、
当たり前だがC#も含めてスレッドプールはこういう設計になる。
膨大なジョブを論理CPU数よりも多いgoroutineでカバーするのは、一般論としては組み方が悪い。
それで速くなる事はないから。
一般的にはその場合はスレッドではなくただのデータオブジェクトとし、論理CPU数と同じスレッド数で回す。
例えば有限要素法のシミュレーションを行う場合、当然データは100万個とかになるが、
CPUが10個なら10分割して、内部は完全に独立して回し、
他CPU担当と隣接してるノードは致し方ないので通信し、CPU10個で協調させながら回す。
これをgoroutine100万個として組むのがGoの思想なのかもしれないが、速くはならないね。
ただし、プログラムは簡単にはなる。
Erlangはだいぶ思想が違う。
あれはスケールアウト時のパフォーマンス低下を回避するために疎結合にしたもので、
実際スケールアウトしてもほぼ性能低下がないのでひたすら物理で殴れるらしいが、
それならErlangでいいよね、でしかない。
尖るってのは、「○○でも出来る」ではなくて、「○○じゃないと出来ない」の事。
Goにはこれがない。
なおC#、.NET4.0の64bit環境では32767個のスレッドが上限らしい。
https://stackoverflow.com/questions/145312/maximum-number-of-threads-in-a-net-app
一般的には、こんなにスレッドが必要な時点で組み方がおかしい、となる。(上記の通り)
> 一億行百万ファイル
普通は10CPUなら10分割して1,000万行10万ファイル*10ジョブにして投入、
レイテンシがバラつくようなら例えばさらに10分割で100万行1万ファイル*100ジョブにする。
これを1,000,000 goroutineで回すメリットは何?
まず、論理CPU数よりも多いスレッドを立ち上げても余計に遅くなる。
だから長時間膨大なタスクの結果を最速で得るためには、
論理CPU数と同じスレッド数で順に処理する事であり、
当たり前だがC#も含めてスレッドプールはこういう設計になる。
膨大なジョブを論理CPU数よりも多いgoroutineでカバーするのは、一般論としては組み方が悪い。
それで速くなる事はないから。
一般的にはその場合はスレッドではなくただのデータオブジェクトとし、論理CPU数と同じスレッド数で回す。
例えば有限要素法のシミュレーションを行う場合、当然データは100万個とかになるが、
CPUが10個なら10分割して、内部は完全に独立して回し、
他CPU担当と隣接してるノードは致し方ないので通信し、CPU10個で協調させながら回す。
これをgoroutine100万個として組むのがGoの思想なのかもしれないが、速くはならないね。
ただし、プログラムは簡単にはなる。
Erlangはだいぶ思想が違う。
あれはスケールアウト時のパフォーマンス低下を回避するために疎結合にしたもので、
実際スケールアウトしてもほぼ性能低下がないのでひたすら物理で殴れるらしいが、
それならErlangでいいよね、でしかない。
尖るってのは、「○○でも出来る」ではなくて、「○○じゃないと出来ない」の事。
Goにはこれがない。
なおC#、.NET4.0の64bit環境では32767個のスレッドが上限らしい。
https://stackoverflow.com/questions/145312/maximum-number-of-threads-in-a-net-app
一般的には、こんなにスレッドが必要な時点で組み方がおかしい、となる。(上記の通り)
> 一億行百万ファイル
普通は10CPUなら10分割して1,000万行10万ファイル*10ジョブにして投入、
レイテンシがバラつくようなら例えばさらに10分割で100万行1万ファイル*100ジョブにする。
これを1,000,000 goroutineで回すメリットは何?
805デフォルトの名無しさん
2022/02/21(月) 17:23:04.30ID:889Qm57n >>804
その考え方が古いでしょ。goroutineは軽量スレッドで実質async await+スレッドプールだよ。
https://zenn.dev/hsaki/books/golang-concurrency/viewer/gointernal
>>804
チャンネルでfan in/fan outしてる。
その考え方が古いでしょ。goroutineは軽量スレッドで実質async await+スレッドプールだよ。
https://zenn.dev/hsaki/books/golang-concurrency/viewer/gointernal
>>804
チャンネルでfan in/fan outしてる。
806デフォルトの名無しさん
2022/02/21(月) 17:48:23.98ID:LC1rF3os >>801
それは例として厳しいかな
C#については全く知らないが
例えばRustではchannelの送受信もasync環境ではasyncとなる
つまりgoroutineのようにchannel送受信だけを永遠にする長時間タスクがあってもタスクは切り替わる
だからそういう例でも大丈夫
おそらくC#でも同じ状況ではないかと推測
それは例として厳しいかな
C#については全く知らないが
例えばRustではchannelの送受信もasync環境ではasyncとなる
つまりgoroutineのようにchannel送受信だけを永遠にする長時間タスクがあってもタスクは切り替わる
だからそういう例でも大丈夫
おそらくC#でも同じ状況ではないかと推測
807デフォルトの名無しさん
2022/02/21(月) 18:21:27.64ID:YbXysJZO goにおけるチャンネルって、概念的には別スレッドのI/Oにデータ渡して発火させる感じだよね
最大スレッド数は開いているチャンネル数以上になることはないし、
メインスレッドには関係ない
async/awaitで詰まるってのはawaitが文字通りメインスレッドで待つからって話ではなく?
最大スレッド数は開いているチャンネル数以上になることはないし、
メインスレッドには関係ない
async/awaitで詰まるってのはawaitが文字通りメインスレッドで待つからって話ではなく?
808デフォルトの名無しさん
2022/02/21(月) 18:35:22.44ID:VpybQnqn goroutineも実質スレッドプールなのは事実だね
async/awaitはawaitの区切りでしか中断できないのに対してgoroutineはGoのユーザーコードならどこでも中断できるので、どちらがより詰まりにくいかといえばGoかもしれない
とはいえGoもシステムコールの中断はできないから、現実には差は出ないだろうね
async/awaitはawaitの区切りでしか中断できないのに対してgoroutineはGoのユーザーコードならどこでも中断できるので、どちらがより詰まりにくいかといえばGoかもしれない
とはいえGoもシステムコールの中断はできないから、現実には差は出ないだろうね
809デフォルトの名無しさん
2022/02/21(月) 18:56:08.62ID:shT+MRih >>804
Erlangは「スケールアウト時のパフォーマンス低下を回避するために疎結合にしたもの」じゃないよ。プロセスが落ちることを前提にしたもので
パフォーマンスなんて考えてないというのは言い過ぎだが、フォールトトレラントでプロセスが落ちるから沢山のプロセスが起動できるようにした
ものであり、スケールアウトによる性能の保持はその結果に過ぎない。
「一億行・百万ファイル」このように初めから総数が分かっていれば分割できますが、総数が分かっていない場合には、「一行・10億ファイル」
かもしれない。この時に「絶え間なく処理結果が欲しい」ような場合だとスレッドを張り付けた処理は、分割された連続処理群が終わるまで
待たねばなりません。GoやErlangだとこのような処理の次に続く処理があった場合、パイプライン処理として処理します。
Erlangは「スケールアウト時のパフォーマンス低下を回避するために疎結合にしたもの」じゃないよ。プロセスが落ちることを前提にしたもので
パフォーマンスなんて考えてないというのは言い過ぎだが、フォールトトレラントでプロセスが落ちるから沢山のプロセスが起動できるようにした
ものであり、スケールアウトによる性能の保持はその結果に過ぎない。
「一億行・百万ファイル」このように初めから総数が分かっていれば分割できますが、総数が分かっていない場合には、「一行・10億ファイル」
かもしれない。この時に「絶え間なく処理結果が欲しい」ような場合だとスレッドを張り付けた処理は、分割された連続処理群が終わるまで
待たねばなりません。GoやErlangだとこのような処理の次に続く処理があった場合、パイプライン処理として処理します。
810デフォルトの名無しさん
2022/02/21(月) 19:20:21.68ID:GbKjQqyn >>805
> その考え方が古いでしょ
これがGo界隈のキモさだよね。自分らが先進的だと勘違いしてる。
なら、何故その先進的な言語がここまで無視されてるのか考えるべきだよ。
シェアで見たら、誰も使ってない言語だよGoなんてさ。
なおRustはポリコレを持ち込んだ馬鹿がいて同様にウザがられているが。
C#のスレッドは論理CPU数を越える起動用には最適化されてないはず。
だからそういう使い方をするためにはスタックサイズをいじらないといけない。
出来たはずだがやり方は知らん。
ただしそれやっても速くはならないよ。(Goもこの点は同じ)
> goroutineは軽量スレッド
これも嘘で、今探しても出てこないが、ラズパイ環境でゴミだったからNodeに戻ったというブログが有ったはず。
512MBのRAMで4kB/goroutineでは十分な量のgoroutineを起動できず、(なお今は2KB/goroutineも選べるんだっけ?)
Nodeでシングルスレッドで処理した方が断然速かったというもの。
Go信者はgoroutineのコストがゼロだと仮定しているが、まったくそうじゃない。
メモリも食うし、空間が別なんだからキャッシュの張替えも発生する。
(Cが地味に速いのはキャッシュにひたすらヒットするから、というのもある)
> チャンネルでfan in/fan outしてる。
意味分からんが、ハードウェアのゲートみたいに各チャネルが複数の入力/出力を持っててネットワークが割と複雑だって事か?
ただこの場合はイベントドリブンで組むことになってて、一応それが一番速いはず。
ハードウェアのゲートを1対1でgoroutineにすることはプログラムとしては記述出来るが、
1億ゲートとかだから4kB/goroutineではオーバースペック過ぎて無駄だ。
ゲートシミュレーションなら精々64Byte/goroutineとかじゃないと駄目だ。だけどこれは無理だろ。
(4kBに縛られてるのはCPUのページサイズに因っているから)
> その考え方が古いでしょ
これがGo界隈のキモさだよね。自分らが先進的だと勘違いしてる。
なら、何故その先進的な言語がここまで無視されてるのか考えるべきだよ。
シェアで見たら、誰も使ってない言語だよGoなんてさ。
なおRustはポリコレを持ち込んだ馬鹿がいて同様にウザがられているが。
C#のスレッドは論理CPU数を越える起動用には最適化されてないはず。
だからそういう使い方をするためにはスタックサイズをいじらないといけない。
出来たはずだがやり方は知らん。
ただしそれやっても速くはならないよ。(Goもこの点は同じ)
> goroutineは軽量スレッド
これも嘘で、今探しても出てこないが、ラズパイ環境でゴミだったからNodeに戻ったというブログが有ったはず。
512MBのRAMで4kB/goroutineでは十分な量のgoroutineを起動できず、(なお今は2KB/goroutineも選べるんだっけ?)
Nodeでシングルスレッドで処理した方が断然速かったというもの。
Go信者はgoroutineのコストがゼロだと仮定しているが、まったくそうじゃない。
メモリも食うし、空間が別なんだからキャッシュの張替えも発生する。
(Cが地味に速いのはキャッシュにひたすらヒットするから、というのもある)
> チャンネルでfan in/fan outしてる。
意味分からんが、ハードウェアのゲートみたいに各チャネルが複数の入力/出力を持っててネットワークが割と複雑だって事か?
ただこの場合はイベントドリブンで組むことになってて、一応それが一番速いはず。
ハードウェアのゲートを1対1でgoroutineにすることはプログラムとしては記述出来るが、
1億ゲートとかだから4kB/goroutineではオーバースペック過ぎて無駄だ。
ゲートシミュレーションなら精々64Byte/goroutineとかじゃないと駄目だ。だけどこれは無理だろ。
(4kBに縛られてるのはCPUのページサイズに因っているから)
811デフォルトの名無しさん
2022/02/21(月) 19:28:42.96ID:shT+MRih >>804
それに「Goにはこれがない。 なおC#、.NET4.0の64bit環境では32767個のスレッドが上限らしい。」という中途半端な知識表現に
ついても一般的なOSではスレッドの上限は16bitの域を出ないで少ないのは当たり前で、それはスレッドがあまりにもOSにとっては
重すぎるから。(メモリやコンテキストスイッチなど払う代償が大きい)
Erlangはだいぶ思想が違うのはその通りだけど、GoはErlangほどではないが、小さいコストで多数の軽量スレッドを用意したもので
あり、これが何のために「Erlangで良いよね?」にならなかったのかといえば、背景にあるのは多数コアを搭載した近年のハードウェアを
生かし切れていない言語が溢れていたから
じゃあGoの役割はなんなのと言えば、Erlangはプロセスがネットワーク分散を簡単にできるが(その分遅め)、Goはコンパクトな
1つのマシンの中で上記のようなパイプライン処理をコンパクトに「なるべく早く」出来るよう考えられた。
それに「Goにはこれがない。 なおC#、.NET4.0の64bit環境では32767個のスレッドが上限らしい。」という中途半端な知識表現に
ついても一般的なOSではスレッドの上限は16bitの域を出ないで少ないのは当たり前で、それはスレッドがあまりにもOSにとっては
重すぎるから。(メモリやコンテキストスイッチなど払う代償が大きい)
Erlangはだいぶ思想が違うのはその通りだけど、GoはErlangほどではないが、小さいコストで多数の軽量スレッドを用意したもので
あり、これが何のために「Erlangで良いよね?」にならなかったのかといえば、背景にあるのは多数コアを搭載した近年のハードウェアを
生かし切れていない言語が溢れていたから
じゃあGoの役割はなんなのと言えば、Erlangはプロセスがネットワーク分散を簡単にできるが(その分遅め)、Goはコンパクトな
1つのマシンの中で上記のようなパイプライン処理をコンパクトに「なるべく早く」出来るよう考えられた。
812デフォルトの名無しさん
2022/02/21(月) 20:10:22.24ID:shT+MRih >>810
あんたのほうがキモイけど、C#の先進性なんて何があるの?俺スゲーのシンタックスシュガーだけでしょ?C#がスタックサイズなんて
弄るのはJavaと同じで基本がClassであり、さらには意味不明な意識高いバカが再帰処理などでメモリーが足りなくなるからです。
シングルスレッド言語とマルチスレッドでメモリ量を比べて起動できないなんて意味ありますか?当然作り方次第でご自慢のC#も
同じになるはずですし、RustやCでも同じことが起こりえますが?逆に言えばGoであってもgoroutine数を少なめにして、スレッドで
アフィニティを設定して使用するCPUをPinningしてやればほぼシングルスレッドと同じ状態を維持できるはずです
「Go信者はgoroutineのコストがゼロだと仮定」これもダウトです、Goを始めたばかりの人だけです。こんなことを言っているのはw
膨大な配列を処理するときにCPUのコア数にきっちり分割して、間にコンテキストスイッチなどを挟まないほうが速いのは当たり前で
鬼の首を取ったように書かなくても多くの人はわかります。だが、Goの開発目的はそうではありません。同様に、Erlangのように
プロセスが落ちる前提で高い耐故障性を前提にするためでもありません。
また今はデフォルトは2kのスタックであり、「4kBに縛られてるのはCPUのページサイズに因っているから」とか、どこの知識なのか逆に
問いたいぐらいです。世の中いろいろなCPUアーキテクチャがありますが?現に多くのCPUは4kですが、s390は2kです
最速を求めるのであればGoもC#でもRustでもなく、ランタイムチェックのないCやアセンブラで書いてなさい。またCが速いのは
「キャッシュにひたすらヒットするから」ではありません。ランタイムチェックが無いからです、近年のマイクロベンチマークを1回でも
見たことありますか?近年のCPUのキャッシュサイズはMB級あるのを知っていますか?
あんたのほうがキモイけど、C#の先進性なんて何があるの?俺スゲーのシンタックスシュガーだけでしょ?C#がスタックサイズなんて
弄るのはJavaと同じで基本がClassであり、さらには意味不明な意識高いバカが再帰処理などでメモリーが足りなくなるからです。
シングルスレッド言語とマルチスレッドでメモリ量を比べて起動できないなんて意味ありますか?当然作り方次第でご自慢のC#も
同じになるはずですし、RustやCでも同じことが起こりえますが?逆に言えばGoであってもgoroutine数を少なめにして、スレッドで
アフィニティを設定して使用するCPUをPinningしてやればほぼシングルスレッドと同じ状態を維持できるはずです
「Go信者はgoroutineのコストがゼロだと仮定」これもダウトです、Goを始めたばかりの人だけです。こんなことを言っているのはw
膨大な配列を処理するときにCPUのコア数にきっちり分割して、間にコンテキストスイッチなどを挟まないほうが速いのは当たり前で
鬼の首を取ったように書かなくても多くの人はわかります。だが、Goの開発目的はそうではありません。同様に、Erlangのように
プロセスが落ちる前提で高い耐故障性を前提にするためでもありません。
また今はデフォルトは2kのスタックであり、「4kBに縛られてるのはCPUのページサイズに因っているから」とか、どこの知識なのか逆に
問いたいぐらいです。世の中いろいろなCPUアーキテクチャがありますが?現に多くのCPUは4kですが、s390は2kです
最速を求めるのであればGoもC#でもRustでもなく、ランタイムチェックのないCやアセンブラで書いてなさい。またCが速いのは
「キャッシュにひたすらヒットするから」ではありません。ランタイムチェックが無いからです、近年のマイクロベンチマークを1回でも
見たことありますか?近年のCPUのキャッシュサイズはMB級あるのを知っていますか?
813デフォルトの名無しさん
2022/02/21(月) 20:13:57.83ID:889Qm57n >>810
お前読んでるか?
お前読んでるか?
814デフォルトの名無しさん
2022/02/21(月) 20:27:03.44ID:/1Q8PAGZ Goのランタイムのフットプリントはかなりでかいし、GCだけでなくそういうコストも許容できる贅沢な環境で、手抜きをして並列処理を書ける言語だよ
ようするに、RustやCで書くのはめんどいしメモリ食われてもいいけど楽してM:Nスケジューラ使いたい、みたいなときには適してる、っていえる言語ではないかと
非同期シングルスレッドしか使わない、っていうんならいろんな言語が選択肢に入りそう
ようするに、RustやCで書くのはめんどいしメモリ食われてもいいけど楽してM:Nスケジューラ使いたい、みたいなときには適してる、っていえる言語ではないかと
非同期シングルスレッドしか使わない、っていうんならいろんな言語が選択肢に入りそう
815デフォルトの名無しさん
2022/02/21(月) 20:29:37.24ID:LC1rF3os >>812
>「Go信者はgoroutineのコストがゼロだと仮定」これもダウトです
これ確かにGoroutineがコスト高いことを知らない人たちが意外に多い
例えばRustのタスクなんかはGoroutineに比べたら本当にコストゼロ
スタックレスであるし素朴な状態マシンとしてコルーチンとして機能するだけ
だからGoroutineよりリソース的にも軽いし起動も軽いし
巨大なランタイムを必要とするGoと違って非常にシンプル
>「Go信者はgoroutineのコストがゼロだと仮定」これもダウトです
これ確かにGoroutineがコスト高いことを知らない人たちが意外に多い
例えばRustのタスクなんかはGoroutineに比べたら本当にコストゼロ
スタックレスであるし素朴な状態マシンとしてコルーチンとして機能するだけ
だからGoroutineよりリソース的にも軽いし起動も軽いし
巨大なランタイムを必要とするGoと違って非常にシンプル
816デフォルトの名無しさん
2022/02/21(月) 20:46:25.71ID:GbKjQqyn >>809
いやErlangは電話交換機用に開発された言語で、メタル回線時代だから最初から物理で殴る前提だ。
(収容数が増えたらラックを増やすしかない)
プロセスどうのこうのはOSの話だ。ただしErlangが生まれた80年代はそこまで綺麗に分離してなくて、
ErlangのランタイムがOS扱いだったのだろうけど。
フォールトトレラント性も多分最初から考えられていたのだとは思う。
> 「一行・10億ファイル」
論理CPU数を数万倍越えるジョブがあると分かっているのなら、纏めればいいだけの話。
単に1ジョブ毎に放り込むのではなく、100ジョブ纏めて取ってきてから放り込めばいい。
原理的にはgoroutine*100と同じ速度が出る。
いやErlangは電話交換機用に開発された言語で、メタル回線時代だから最初から物理で殴る前提だ。
(収容数が増えたらラックを増やすしかない)
プロセスどうのこうのはOSの話だ。ただしErlangが生まれた80年代はそこまで綺麗に分離してなくて、
ErlangのランタイムがOS扱いだったのだろうけど。
フォールトトレラント性も多分最初から考えられていたのだとは思う。
> 「一行・10億ファイル」
論理CPU数を数万倍越えるジョブがあると分かっているのなら、纏めればいいだけの話。
単に1ジョブ毎に放り込むのではなく、100ジョブ纏めて取ってきてから放り込めばいい。
原理的にはgoroutine*100と同じ速度が出る。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国連大使「日本が中国に武力行使すると脅しをかけたのは初めて」 国連事務総長に書簡★4 [♪♪♪★]
- 【芸能】44歳・池脇千鶴、激変ぶりにネット衝撃 「まるで別人…」「変化が凄い!!」の声 [冬月記者★]
- なぜ立花孝志氏の言葉は信じられたのか…"異例の逮捕"が浮き彫りにした「SNSの危険な病理」 [ぐれ★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★15 [BFU★]
- 台湾有事での集団的自衛権行使に「賛成」が48.8%、「反対」が44.2% ★9 [♪♪♪★]
- 竹中平蔵氏、万博は大成功だったと持論 批判していた人々にチクリ「反省の弁の一つも聞きたい」 [バイト歴50年★]
- (*´ω`*)🔫(´・ω・`)終わりだ
- 風呂入ったあとうんこしたら損した気分になるよな
- 中国政府「私たちが怒っているのは日本国民じゃない」
- (っ◞‸◟c)
- 【愛国者悲報】サナエ、カードゲームで敗北... [856698234]
- 中国「ごめん、色々やりすぎた謝るから和解してほしい」高市首相「舐めてんの?」 [834922174]
