Ref, Var, Agent, Atom의 Clojure 차이점 (예제 포함)
저는 Clojure를 처음 접했습니다. 실제 시나리오에 대해 설명 해주시겠습니까? 내, Ref, Var, Agent, Atom을 어디에 사용할 것인지 의미합니다. 책을 읽었지만 여전히 실제 사례를 사용했습니다.
이 질문에 대한 실제 답변을 위해 "The Joy of Clojure"또는 "programming Clojure"를 적극 권장합니다. 각각에 대한 동기에 대한 짧은 배치를 재현 할 수 있습니다.
의심의 개념에 대한이 비디오를 시청 하거나 여기서 공부하십시오 .
- 참조는 "많은 ID"에 대한 조정 된 동기 액세스를 위한 것 입니다.
- Atom은 단일 ID에 대한 조정 되지 않은 동기식 액세스를위한 것입니다.
- 에이전트는 단일 ID에 대한 조정 되지 않은 액세스를위한 것입니다.
- Vars는 공유 URL을 사용하는 로컬 격리 ID 용 입니다.
조정 된 액세스는 두 ID를 함께 변경해야 할 때 사용됩니다. 전형적인 예는 한 은행 계좌에서 다른 은행 계좌로 돈을 이동하는 것입니다. 전혀 이동하지 않습니다.
조정되지 않은 액세스는 하나의 ID 만 업데이트해야 할 때 사용되며 매우 일반적인 경우입니다.
계속하기 전에 모든 ID가 정산 될 때까지 호출이 대기 할 때 예상되는 경우 동기 액세스가 사용됩니다.
비동기 액세스는 "실행 후 잊어 버리기"이며 ID가 자신의 시간에 새로운 상태에 도달하도록합니다 .
참조는 동기화되어야하는 상태를위한 것입니다. 여러 가지를 추적해야하고 여러 가지에 한 번에 쓰는 작업을 수행해야하는 경우 참조를 사용합니다. 상태의 여러 부분이있을 때마다 참조를 사용하는 것은 나쁜 생각이 아닙니다.
Atom은 동기화되어야하는 독립 상태를위한 것입니다. 원자의 상태와 다른 것을 사용하는 것이 하나의 원자를 사용하는 것이 안전합니다 (전체 프로그램에 상태가 만있는 경우 원자에 넣을 수 있습니다). . 사소하지 않은 예로서 함수의 반환 값을 캐시 (즉, 메모) 안전하려는 경우 원자를 사용하는 것이 가능합니다. 표시되지 않은 함수 외부의 모든 항목에 표시되지 않습니다. 함수 내부의 상태 변경에 대해
에이전트의 주요 요점은 다른 언어에서 실행되는 것입니다. 에이전트의 값을 가져 오는 그 값에 함수를 적용 할 지시 할 수 있습니다 함수가 언제 될 실행 지 또는 함수가 값은 알 수 없습니다.
Vars는 필요할 때 사용하는 것을 저장해야합니다. 다수의 경우 프로그램이 고유 한 경우 고유 한 상태가 필요한 해당 상태를 var에 넣습니다.
실제 예제가 진행되는 한 수행하려는 작업의 예제를 제공하면 어떤 작업하는지 알려줄 수 있습니다.
어떤 유형에 대해 읽었을 때 유형을 사용하거나 사용하는 위치를 이해하는 데 어려움을 겪고있는 곳에서 여기에 내 평범한 영어가 있습니다.
데이터가 변경되지 않을 때 사용하십시오. 이 def
또는 def
같이 시작하는 대부분의 기능을 사용할 때마다 발생합니다 defn
.
변경되는 단일 항목이있을 때 원자를 사용하십시오. 항목을 추가하려는 카운터 또는 벡터를 예로들 수 있습니다.
동시에 변경해야하는 두 개 이상의 항목이있을 때 참조를 사용합니다. 익숙하다면 "데이터베이스 트랜잭션"을 생각하십시오. 이것의 표준적인 예는 한 계좌에서 다른 계좌로 돈을 이체하는 것입니다. 각 계정은 저장되어 변경 사항이 원자로 표시 할 수 있습니다.
언제든 상관하지 않을 때 에이전트를 사용하십시오. 이것은 긴 계산이거나 파일 또는 소켓에 시나리오를 쓰는 것입니다. 후자의 경우 send-off
.
참고 : 훨씬 더 많은 내용이 점에 감사하지만 이것이 시작점을 제공 할 것입니다.
나는 그들 사이의 차이점을 요약하여 사용할 때 사용할 수있는 것을 요약하여 사용할 수 있습니다.
공유 상태 -vars, atom, agent 및 refs를 사용할 때?
그 주제에 대한 답을 찾는 사람들에게 도움이되기를 바랍니다.
@tunaci 제안 후 기사의 일부 바로 가기 :
Vars
Vars는 모든 경우에 대해 전역 적입니다.
생성 후 변수를 변경하지 않습니다. 기술적으로 가능하지만 여러 가지 여러 가지 나쁜 생각입니다.
원자
모든 경우에 대해 변경 가능한 상태에 대한 액세스를 공유합니다. 변경은 동 기적으로 발생합니다. 다른 프로그램이 실행 중에 상태를 변경하면 재 시도하십시오.
멱등 함수 및 함수를 사용하지 않습니다.
자치령 대표
모든 경우에 대해 변경 가능한 상태에 대한 액세스를 공유합니다. 변경은 발생합니다.
참조
Refs는 데이터베이스 트랜잭션과 유사하게 작동합니다. 쓰기와 읽기는 dosync에서 보호됩니다. 거래에서 안전한 심판을 운영 할 수 있습니다.
일부 업데이트는 항상 웹 사이트의 이미지를 참조하십시오.
복사 및 과거 기사 전체 서비스를 제공하는 복잡하고 긴 주제 제공 웹 사이트로 리디렉션되는 것을 용서 서비스 제공 :)
원자, 심판 및 에이전트-여기에 일부 조명 http://blog.jayfields.com/2011/04/clojure-state-management.html
'IT' 카테고리의 다른 글
C ++ 용 온라인 이름 demangler가 있습니까? (0) | 2020.08.14 |
---|---|
Bash에서 각 파일과 디렉토리의 크기를 (재귀 적으로) 어느 정도 정렬해야합니까? (0) | 2020.08.14 |
Swashbuckle을 사용하여 WebAPI의 Swagger 문서에서 메서드를 생략하는 방법 (0) | 2020.08.14 |
Docker 실행을 통해 셸 펼쳐보기에 인수를 전달하는 방법 (0) | 2020.08.14 |
RegEx가없는 String.replaceAll (0) | 2020.08.14 |