7

Go で CMS を作成しており、セッション タイプ (ユーザー ID、レンダリングするページ コンテンツなど) があります。理想的には、その型をグローバル変数にしたいので、ネストされたすべての関数に伝播する必要はありませんが、そのようなグローバル変数を持つことは、新しいセッションごとに前のセッションを上書きすることを意味します。つまり、壮大な失敗になるでしょう。

一部の言語では、そのスレッド内で保持されるグローバルをスレッド内に保持する方法を提供します (つまり、そのグローバルの値はそのスレッド内でサンドボックス化されます)。ゴルーチンがスレッド化されていないことは承知していますが、自由に使える同様のメソッドがあるかどうか、またはさまざまなネストされたルーチンを介してセッション タイプのローカル ポインターを渡す必要があるかどうか疑問に思いました。

チャンネルはこれをしないと思いますか?私が収集できるものから(ここで間違っている場合は修正してください)、基本的にグローバル変数を共有する安全な方法ですか?

編集:この質問を忘れていました!とにかく、興味のある人のための更新です。この質問は、私が Go を初めて使用したときに書かれたもので、CMS は基本的に私の最初のプロジェクトでした。私は POSIX スレッドに精通した C のバックグラウンドを持っていましたが、関数パラメーターでポインターとして渡されるセッション オブジェクトを使用して、モード機能設計でコードを記述することがより良いアプローチであることにすぐに気付きました。これにより、コピーするデータの量を最小限に抑えながら、求めていたコンテキスト依存のローカル スコープが得られました。ただし、7 年前のプロジェクトであり、Go への移行が始まったばかりのプロジェクトであるため、多くの間違いが発生しているため、プロジェクトを大幅に書き直すことができると言っても過言ではありません。ただし、それは別の日の懸念事項です-現在は機能しており、外出先で他のプロジェクトが十分にあります。

4

3 に答える 3

4

次のようなものを使用する必要がありますContext

http://blog.golang.org/context

基本的に、パターンは、Contextやりたいことごとに独自のものを作成することです。(あなたの場合はWebリクエスト。)context.WithValueコンテキストに複数の変数を埋め込むために使用します。次に、常に最初のパラメーターとして、他のゴルーチンでさらに作業を行っている他のメソッドに渡します。

コンテキストから必要な変数を取得するには、context.Valueゴルーチン内から呼び出すだけです。上記のリンクから:

AContextは、複数のゴルーチンによる同時使用に対して安全です。コードは単一Contextのゴルーチンを任意の数のゴルーチンに渡し、それをキャンセルしContextてそれらすべてにシグナルを送ることができます。

メソッドのパラメーターとして変数を明示的に送信する実装がありましたが、コンテキストを使用してこれらの変数を埋め込むと、コードが大幅にクリーンアップされることがわかりました。

を使用すると、チャネル、 、および「完了チャネル」と呼ばれる概念Contextを使用して長時間実行されるタスクを終了する方法が提供されるため、これも役立ちます。select基本的なレビューと実装については、次の記事を参照してください。

http://blog.golang.org/pipelines

最初にパイプラインの記事を読んで、ゴルーチン間の通信を管理する方法を理解することをお勧めします。次に、コンテキストの記事を読んで、レベルアップして変数の埋め込みを開始して渡す方法を理解することをお勧めします。

幸運を!

于 2014-08-13T16:03:08.003 に答える
1

複数のユーザーがいる場合、接続ごとにその情報は必要ないでしょうか? したがって、接続されているユーザーごとに構造体があると思います。ワーカー goroutine をセットアップするとき、またはチャネルを介してポインターを渡すときに、その構造体へのポインターを渡すのは慣用的な Go です。

于 2013-04-04T05:50:07.387 に答える