不要通过共享内存来通信,而应该通过通信来共享内存
这是一句风靡golang社区的经典语,对于刚接触并发编程的人,该如何理解这句话?
PHP中文网2017-04-18 10:55:51
https://blog.golang.org/share...
이 기사에서는 공유 메모리를 사용하는 경우 멀티 스레드 시나리오에서 경쟁 조건을 처리하려면 잠금을 수행해야 하며 이는 사용하기 더 까다롭다는 점을 더 명확하게 설명합니다. 또한 너무 많은 잠금을 사용하면 프로그램의 코드 논리를 쉽게 이해하기 어렵게 만들고 프로그램이 쉽게 교착 상태에 빠지게 할 수 있으며, 특히 교착 상태가 발생한 후에는 문제를 해결하기가 매우 어렵습니다. 같은 시간.
Go 언어의 채널은 동시에 하나의 고루틴만이 내부 데이터에 액세스할 수 있도록 보장하여 개발자에게 우아하고 간단한 도구를 제공합니다. 따라서 Go의 기본 방법은 공유 메모리를 사용하는 대신 채널을 사용하여 통신하는 것입니다. 의사소통하다.
PHP中文网2017-04-18 10:55:51
공유 메모리에는 동시에 데이터에 액세스하고 수정하는 여러 스레드가 포함됩니다. 데이터의 보안과 가시성을 보장하기 위해 잠금이 수행되어 병렬 처리가 직렬화로 바뀌고 CPU도 스레드로 사용됩니다. 잠그다. 방법을 변경하고 데이터의 복사본을 만드는 것이 좋습니다. 각 스레드는 하나의 작업을 완료하는 한 다른 스레드가 잠금을 잡을 필요가 없습니다. 동시성을 달성하기 위해 알림 형식으로 전달됩니다.
伊谢尔伦2017-04-18 10:55:51
사실 분산적인 관점에서 이해하면 더 명확해집니다.
예를 들어 두 프로세스 ab가 동일한 메시지 대기열에서 함께 작동하는 경우 공유 메모리를 사용하면 두 프로세스가 동일한 물리적 시스템으로 제한되어야 합니까? 그러면 통신의 의미가 크게 줄어듭니다.
설계 과정에서 메시지 큐에 읽기 및 쓰기 인터페이스만 제공되고 내부 구현에 대해 전혀 걱정할 필요가 없다면 메시지 큐가 공유 메모리처럼 보일 것입니다. 그러나 메시지 대기열은 소켓을 사용하여 통신할 수 있습니다.
그래서 위 문장에서 공유 메모리를 사용하여 통신을 구현하지 않는다는 것은 처음부터 프로그램을 단일 머신으로 제한하지 않고 통신을 사용한다는 의미, 즉 내부 구현을 캡슐화하고 인터페이스를 제공한다는 의미입니다. 해당 작업을 수행하려면