2014-04-09 3 views
7

상태가 함수에 나쁜 생각으로 여겨지는 경우 MailboxProcessor를 사용할 때 상태가 괜찮은 것으로 간주되는 이유는 무엇입니까?F # MailboxProcessor 및 Functional Design

확장하려면 누군가가 기능을 사용하지 않는 기능 프로그래밍 (예 : 기능 외부의 변수가 없습니다. 즉, 동일한 데이터에 동일한 데이터가 있음)과 이것이 가져 오는 좋은 점을 설명했습니다. 그러나 MailboxProcessor와 함수 호출 사이에 상태를 유지하기 위해 재귀를 사용하는 방법을 생각해 보았습니다. 그런 상황에서 왜 그것이 괜찮은지조차 제대로 파악할 수 없습니다.

상태를 유지하는 가장 나쁜 방법인가요?

답변

13

악마는 실제로 공유 가능 상태입니다. 단일 스레드의 경우, 공유 가변 상태는 함수가 안전하게 구성 될 수 없음을 의미합니다. 하나의 호출이 두 번째 호출에 의해 읽혀지는 상태를 수정할 수 있으므로 예기치 않은 결과가 발생하기 때문입니다. 멀티 쓰레 디드 (multi-threaded)의 경우 공유 가능 상태 란 경쟁 조건이 발생할 가능성이 있음을 의미합니다.

기능 프로그래밍은 일반적으로 돌연변이를 피합니다. 함수는 여전히 일부 상태 (예 : 클로저가 상태를 캡처 할 수 있음)를 공유 할 수 있지만 변경 될 수는 없습니다. 단일 스레드의 경우에는 비 결정 성도 없습니다. 멀티 쓰레드의 경우 순수한 함수 스타일로 할 수있는 유일한 일은 가변적 인 상태를 필요로하지 않고 완전히 결정 론적 인 포크 - 조인 병렬 처리 (및 데이터 - 병렬 처리)를 수행하는 것입니다.

또한 에이전트 기반 프로그래밍은 공유 가능한 상태를 피하지만 다른 방식으로 사용합니다. 불변 메시지 만 공유 할 수있는 상담원을 격리했습니다. 따라서 (메시지를 보내어 의사 소통하기 때문에) 결정적이지 않은 요소가 있지만 불변 값만 교환합니다. 실제로 에이전트 내부에서 가변 상태를 사용할 수도 있습니다. 공유되지 않는 한 공유 가능 상태를 피할 수 있습니다.

+0

배우 상태 및 비 결정성에 대한 자세한 내용은 [여기] (http://james-iry.blogspot.com/2009/04/erlang-style-actors-are-all-about.html) 및 [여기] (http://pchiusano.blogspot.com/2013/09/actors-are-overly-nondeterminstic.html) – eulerfx