액터는 스레드와 비교하여 어떻게 작동합니까?
스레드와 비교하여 액터가 작동 하는 방식에 대한 좋고 짧은 설명이 있습니까?
스레드가 액터로 간주되어 다른 스레드에 메시지를 보낼 수 없습니까? 나는 약간의 차이를 보았지만 나에게는 그다지 명확하지 않습니다. 스레드를 다르게 사용하여 어떤 언어로든 액터 를 사용할 수 있습니까 ?
액터 모델은 메시지 전달에서 작동합니다. 개별 프로세스 (액터)는 서로 비동기 적으로 메시지를 보낼 수 있습니다. 이것이 우리가 일반적으로 스레딩 모델로 생각하는 것과 구별되는 것은 (적어도 이론 상으로는) 공유 상태가 없다는 것입니다. 그리고 공유 상태가 모든 악의 근원이라고 믿으면 (당연히, 제 생각에는) 배우 모델이 매우 매력적으로 변합니다.
그러나 우리는 너무 흥분해서는 안됩니다. 행위자 모델은 (일부 주장과는 반대로) 교착 상태를 불가능하게 만들지 않습니다. 행위자 모델은 또한 다른 프로세스 (예 : 메시지 대기열)간에 리소스에 대한 경합을 방지하지 않습니다. 이 모델은 특정 수준 이상에서만 "잠금 해제"상태입니다. 하위 수준에서 메시지 대기열을 조정하려면 잠금이 여전히 필요합니다.
스레드가 액터로 간주되어 다른 스레드에 메시지를 보낼 수 없습니까?
글쎄, 예 그리고 아니오. 아니요, 공유 메모리 위치 주변에 뮤텍스를 배치하는 방법을 사용하는 경우입니다. 그런 다음 스레드는이 상태를 공유합니다. 둘 다이 메모리에 액세스 할 수 있고, 읽을 수 있고, 다시 쓸 수 있습니다.하지만 스레딩 모델 위에 액터 모델을 구축 할 수 있으며 실제로 모든 액터 구현에는 스레드가 있습니다. 아래에. 나는 재미를 위해 뮤텍스에 의해 보호되는 대기열을 각 스레드에 제공하여 이와 같이 (매우 나쁘게) 해킹했습니다. 액터 스레드 임피던스가 관리되는 방법에 대한 아이디어를 얻으려면 1 년 전의 제 질문을 참조하십시오 .
스레드를 다르게 사용하여 어떤 언어로든 Actor Model을 사용할 수 있습니까?
예,하지만 좀 더 많은 작업이 필요합니다. 좋아하는 언어에는 메시지 전달 라이브러리가있을 수 있으므로 가장 먼저 조사해야합니다. 또한 변경 불가능한 데이터 구조의 사용을 조사해야합니다. 데이터 구조가 변경 불가능한 경우 기본적으로 "공유 상태"문제를 처리 한 것입니다. 여러 스레드가 나쁜 일없이 변경 불가능한 데이터에 대한 참조를 보유 할 수 있습니다. 액터 언어가 기능적 언어 (erlang, scala) 인 경향이있는 이유가 있습니다.
또한 다르지만 매력적인 모델 인 소프트웨어 트랜잭션 메모리를 살펴볼 수도 있습니다. Clojure는 제가 가장 좋아하는 예입니다.
액터가 항상 비동기 적으로 메시지를 전달한다고 말하지는 않겠습니다. 너무 느릴 것입니다. 적절한 경우, JActor 프로젝트는 메소드 호출을 더 잘 모델링하기 위해 양방향 메시지 (요청 / 응답)를 사용합니다. 그리고 대부분의 요청은 동 기적으로 처리됩니다.
JActor (Java 라이브러리)도 잠금을 사용하지 않습니다. 몇 개의 세마포어가 던져진 일부 원자 및 동시 데이터 구조 만 있습니다. 메시지 전달은 초당 약 0.8 억 메시지입니다.
https://github.com/laforge49/JActor
참고 URL : https://stackoverflow.com/questions/3583137/how-does-actors-work-compared-to-threads
'program story' 카테고리의 다른 글
Github에서 테스트 통과 / 실패를 어떻게 표시합니까? (0) | 2020.09.17 |
---|---|
build.gradle (Project)와 build.gradle (Module)의 차이점 (0) | 2020.09.17 |
git push.default = current와 push.default = upstream의 차이점은 무엇입니까? (0) | 2020.09.17 |
주소 유효성 검사를 어떻게 수행합니까? (0) | 2020.09.17 |
varchar (max) 변수의 최대 크기 (0) | 2020.09.17 |