ホームページ  >  記事  >  バックエンド開発  >  この Golang プログラムの同期の問題

この Golang プログラムの同期の問題

WBOY
WBOY転載
2024-02-10 09:06:09380ブラウズ

この Golang プログラムの同期の問題

php エディタ Apple は本日、興味深いトピック「この Golang プログラムの同期の問題」を紹介します。並行プログラムを作成する場合、同期の問題、つまり複数のスレッド間の競合と調整に遭遇することがよくあります。 Golang は並行プログラミング言語として、豊富な同期メカニズムとツールを提供しますが、注意と解決策が必要な一般的な同期の問題もいくつかあります。この記事では、これらの問題を詳細に調査し、Golang における同期の課題を誰もがよりよく理解し、対処できるように、対応する解決策を示します。一緒に探検しましょう!

質問内容

プロキシサーバーとして機能し、新しいエンドポイントに動的に切り替えることができるプログラムを作成しようとしています。しかし、問題が発生しました。switchovertonewendpoint() を呼び出した後、閉じる必要がある元のエンドポイント 8.8.8.8 に接続されているプロキシ オブジェクトがまだいくつかあります。

リーリー

しばらく考えた結果、問題は

にあると思います。 リーリー

しかし、これが根本的な原因であるかどうか、また次のものに置き換えることで修正できるかどうかはわかりません:

リーリー

このケースを再現するのは難しいので、専門家がアイデアやヒントを提供していただけますか?コメントは大歓迎です。前もって感謝します。

解決策

問題

変化が必要です。元の実装では、

lateproxies は同じマッピングを保持していました。このデモを参照してください: リーリー

しかし、これは根本的な原因ではありません。新しいプロキシは、

closeproxies をコピーした後、setswitchover を呼び出す前に追加できます。この場合、新しいプロキシは古いアドレスに接続しますが、closeproxies にはありません。これが根本的な原因だと思います。

まだ質問があります。新しいプロキシは、

to フィールドが設定される前に proxies に追加されます。プログラムは、to フィールドを設定する前にこのプロキシを閉じようとし、パニックを引き起こす可能性があります。

信頼性の高い設計

このアイデアは、すべてのエンドポイントをスライスに配置し、各エンドポイントが独自のプロキシ リストを管理できるようにすることです。したがって、現在のエンドポイントのインデックスを追跡する必要があるだけです。別のエンドポイントに切り替えたい場合は、インデックスを変更し、古いエンドポイントにプロキシをクリアするように指示するだけです。残る唯一の複雑な問題は、古いエンドポイントがすべてのプロキシを確実にクリアすることです。以下の実装を参照してください:

manager.go

これはこのアイデアの実現です。

リーリー

main.go

このデモでは、以前に実装された

manager タイプの使用方法を示します: リーリー

manager_test.go

次のコマンドを使用してテストを実行します:

go test ./... -race -count 10 リーリー

以上がこの Golang プログラムの同期の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。