grpc++なんもわかんねーーーーー
ボンクラプログラマー
頭とお腹が弱い。
最近は個人鯖の @shibafu528 がメインです。
⚠️ CW設定のない下品な発言が非常に多いです。これは仕様ですのでご了承下さい。
ℹ️ spam対策でフォロー承認制にしています。上の一文が構わないという方ならお気軽にどうぞ。
FINAL FANTASY XIV 関連の著作物は
(C) SQUARE ENIX CO., LTD. All Rights Reserved.
しかしgRPCは普通protocが吐いたStubを挟んで使うものなので、まあ……
ためしにcpp版のexampleをmakeしてみたら、grpc用の生成コードなかなかおぞましいことになってて涙が
これもしかしてかなり細かくCompletionQueueのポーリング入れる必要あるか
全ての非同期処理は指定したCompletionQueueに完了が報告される、というのはgrpc++では何やっても変わらないっぽいんだけど、GenericかつUnary以外だとその手続きが増える?
オ、PrepareUnaryCallはやっぱり手続きを簡略化しただけで、PrepareCallから手続きしてもUnary Call処理できるみたいだな
言ってしまえばUnary Callはこちらから1発送信して、そのあと1発だけメッセージを待ち受けて終了する手続きなんだな。
横着してCompletionQueueで何が完了したか判別するためのtagを全無視している
CompletionQueue、処理が完了するまでブロックするNextだけでなく制限時間を指定して強制的に戻ってくるAsyncNextもある
AsyncNextを使いこなせるほどC++プログラマではないので、まあ大人しくスレッド立ててNextすっかねえ
R/Wはそれぞれ別で回せるから、通信種別に関係なく接続完了したらReadは回しっぱなしにして良さそうだな
CompletionQueue共有して問題ないのかなはあるが
C++でgRPC、めるぽんさんの記事とか出てくるからヤバイ場所に足を踏み入れてしまった感が強い
CompletionQueueはリクエストに紐付くけど、R/Wはそれぞれスレッドセーフらしいしまあ大丈夫なんだろう
普通gRPCとかGolangで使うもんやろwwwwwwwww(さまざまな場所に石が当たりそうな発言)
Golangとかはなんか言語ネイティブの実装だった気がするんだけど、バインディングしてる言語のgRPCだと変なことすると突然ネイティブクラッシュしてC++のコードのバックトレースでてきて嫌な気持ちになる
誰がスクリプト言語でやってるのに突然reinterpret_castしながら爆死してるバックトレース見たいんだよ(もう見た)
なんか週明けまでにFloraRPCでStreamingサポートしたいんやけど、うーん
CompletionQueue、BiDi Streamだとユーザー操作でWriteしたり、ServerからぼこぼこReadしたりでTag管理大変なことになりそうだけど、どうしようね
今実行中のR/Wそれぞれで被りさえしなければいいので、32bitくらいの雑な乱数を作って使用中じゃなければオッケーでもいい……けどこれも結局使ってるかの確認が必要だから最初のと変わらんわ
R/W同方向が2つ以上別スレで同時に走ることは禁止されているので、ロック取るみたいなことしなくていい
これをきれいにラップしてるのが各言語バインディングなんだって思うと、なんか今後突然gRPCが発狂してバックトレースゲロってもグルー層のCコードとか読めるんじゃね
Tissueで使うの一瞬考えたけど、gRPCがHTTP2を要求するせいでクライアントと直接HTTP2セッションで会話できないPHPは自動的に虐殺されてるからおしまい
全部PHP上で実装してデーモンとして上げればいいんだろうけど(実際そういうのは見た気がする)、それはもはやPHPだろうか
PHPってのはぁ……SAPIレイヤーがいい感じにHTTPリクエストを抽象化してくれてぇ……あとは1回レスポンスするだけ!っていう手続きを実行するもんだルルォ!?
んまPHPスクリプトは何かしらハンドラを登録するだけで、最後にrun()みたいな関数呼んだらnative extに制御が飛んでその中で諸々リッスンして登録ハンドラへのルートを行う〜とかやりゃできるっちゃできるんだろう……な……
まだC++とRubyくらいしかAPI見てないから、Golangのやつとかどうなってるか見たいなぁと思いつつ、絶対Golangやりたくねえなぁと思いつつ
GolangのほうがRubyバインディングよりは深いAPIありそうだなと予想してるんだけど
拡張性を犠牲にしないスタイリッシュなMini-ITXケース、Fractal Design「Era ITX」 - エルミタージュ秋葉原
http://www.gdm.or.jp/pressrelease/2020/0319/342033
このさもC++かのように居座ってる "signals:" とかやっぱりQtお前……ってなるな
QMLへのバインディングにも使うけど、メタデータに刻まれるのでダイナミックアクセスできるようになる
The Meta-Object System | Qt Core 5.14.1
https://doc.qt.io/qt-5/metaobjects.html
まあQt 6ではPropertyだけ進化してQObject依存なくなるらしいですが
プロパティバインディングのためのテンプレートとして発展して、Meta-Object Systemに乗らずに処理できるようになるっぽ
キューに何かしらぶっこんだら、結果ができ次第メインスレッドにsigするやつ書きたいけど、Qtの非同期全然分からんな
ひたすら外部ライブラリのブロッキングキューをpollして結果に応じて処理するの、これは素のThreadの出番ではいう気持ちになってきた
最近普通のクライアントアプリ書いてないから、こういう時どうするんだっけみたいな引き出しが開かないな
久々にマルチスレッドやることになったが人類の頭はマルチスレッドプログラミングができるようにはなっていない(クソデカ主語)
おぉ、pimplのためにcpp内でQ_OBJECT使った場合、自分で自動生成ファイルをincludeしないといけないのか。
敗因: 所属スレッドの異なるオブジェクトのsignalを無理やり呼び出したのでイベントキューシステムが無視されて崩壊した
Window[slot] ←[signal] Wrapper [slot]←(スレッド跨ぎ) ←[signal] Worker
で上げていけば上手く動くはずなんだけど、横着して
Window[slot] ←[signal] Wrapper ←(ただの関数呼び出し)← Worker
した
QObjectに乗っかるなら、あまりstd型とかライブラリ型露出させないで取り回すほうが良さそうだなー
Qt、invokeMethodとかいうメソッドでスレッド跨ぎメソッド呼び出し一応できるのか……なんかWinFormsのInvokeを思い出すんだが
なんでQMapはconnectデフォルト対応なのにQMultiMapはできないんだよwwwwe
半日もこんなんやってたら気が狂うわ >> 非同期処理化 · shibafu528/florarpc@90545fb
https://github.com/shibafu528/florarpc/commit/90545fbe3155e51532381ba8166e7849d5eb8635
service CheckinService {
rpc checkin(net.shikorism.EjaculationRequest) returns (net.shikorism.Ejaculation);
}
grpc-rubyちょっとだけ眺めてるんだけど、grpc++のせいでマジで1mmくらいアレルギー減ったな
CompletionQueueのポーリングしてる時はちゃんとGVL外してるんだなあとか
FloraRPCのRESとmikutterのRESを並べたらこっちの線が床ペロする
ここに1日分の野菜をプラスすることで、1.3日分くらいの野菜を摂取したことにできそう