>백엔드 개발 >Golang >이 Golang 프로그램의 동기화 문제

이 Golang 프로그램의 동기화 문제

WBOY
WBOY앞으로
2024-02-10 09:06:09407검색

이 Golang 프로그램의 동기화 문제

PHP 편집기 Apple은 오늘 "이 Golang 프로그램의 동기화 문제"라는 흥미로운 주제를 소개할 것입니다. 동시성 프로그램을 작성할 때 동기화 문제, 즉 여러 스레드 간의 경쟁과 조정 문제에 자주 직면합니다. 동시 프로그래밍 언어인 Golang은 풍부한 동기화 메커니즘과 도구를 제공하지만 주의와 솔루션이 필요한 몇 가지 일반적인 동기화 문제도 있습니다. 이 기사에서는 이러한 문제를 자세히 살펴보고 모든 사람이 Golang의 동기화 문제를 더 잘 이해하고 처리하는 데 도움이 되는 해당 솔루션을 제공합니다. 함께 탐험해 보세요!

질문 내용

프록시 서버 역할을 하고 새 엔드포인트로 동적으로 전환할 수 있는 프로그램을 만들려고 합니다. 그런데 switchovertonewendpoint() 后,仍然有一些代理对象连接到原始端点 8.8.8.8 에 전화할 때 전원을 꺼야 한다는 문제가 발생했습니다.

으아악

잠깐 생각해보니 문제는

으아악

하지만 이것이 근본 원인인지, 다음으로 교체하여 해결할 수 있는지는 확실하지 않습니다.

으아악

이 사례는 재현하기 어렵기 때문에 전문가가 아이디어나 팁을 제공할 수 있나요? 어떤 의견이라도 환영합니다. 미리 감사드립니다.

해결책

문제

변화가 필요합니다. 원래 구현에서는 latedproxies가 동일한 매핑을 유지했습니다. 이 데모 보기:

으아악

그러나 이것이 근본 원인은 아닙니다. 복사 가능 closeproxies 之后但在调用 setswitchover 之前添加新代理。在这种情况下,新代理连接到旧地址,但不在 closeproxies. 나는 이것이 근본 원인이라고 생각합니다.

질문 하나 더. to 字段之前,将向 proxies 添加新代理。程序可能希望在设置 to 필드를 설정하기 전에 이 프록시를 닫으면 패닉이 발생합니다.

신뢰할 수 있는 디자인

모든 엔드포인트를 하나의 슬라이스에 넣고 각 엔드포인트가 자체 프록시 목록을 관리하도록 하는 것이 아이디어입니다. 따라서 우리는 현재 엔드포인트의 인덱스를 추적하기만 하면 됩니다. 다른 엔드포인트로 전환하려면 인덱스를 변경하고 오래된 엔드포인트에 프록시를 지우라고 지시하면 됩니다. 남은 유일한 문제는 오래된 엔드포인트가 모든 프록시를 삭제하는지 확인하는 것입니다. 아래 구현을 참조하세요.

manager.go

이 아이디어의 실현입니다.

으아악

main.go

이 데모에서는 이전에 구현된 manager를 사용하는 방법을 보여줍니다. 유형:

으아악

manager_test.go

다음 명령을 사용하여 테스트를 실행하세요. go test ./... -race -count 10

으아악

위 내용은 이 Golang 프로그램의 동기화 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제