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