2009-01-26 4 views
0

나는 정말로 다른 객체에 어떤 책임을 전가하고 다른 스레드에서 리턴 할 수있는 기능을 원한다. 호출자가 스레드를 전환했다는 것을 알 수 없다는 것을 의미하는 것을 알지만 실제로 호출 된 스레드와 다른 스레드에서 함수를 반환하는 방법이 있는지 알고 싶습니다.F #에서는 한 스레드에서 호출되지만 다른 스레드에서 반환되는 함수를 사용할 수 있습니까?

답변

2

비동기 워크 플로는 다음과 같은 환상을줍니다.

async { 
    printfn "on thread 1..." 
    let! r = stream.ReadAsync() 
    printfn "on thread 2 now..." 
    ... 
} 

하지만 코드를 읽기 쉽고 작성하고 추측하기 쉽도록 만드는 환상입니다. 후드 아래에서는 BeginRead/EndRead/callbacks/등으로 모든 정상적인 비동기 작업을 수행합니다.

3

스레드 작동 방식에 대한 오해가있는 것 같습니다. 하나의 스레드에 함수를 입력하고 다른 스레드에서 함수를 종료 할 수 없습니다. 스레드는 별도의 스택을 가지며 스택은 현재 어떤 기능을 유지 관리합니까? 당신이 할 수있는 것은 비동기 API를 사용하는 것입니다.이 API는 즉시 반환되고 나중에 결과를 다시 검색 할 수있는 함수를 호출합니다.

옵션은 다음과 같습니다 : 그것은 결과를 제공 '(완료 표시되면

일부 비동기 작업 ('아직 완료 ')의 상태 쿼리를 허용 값과 결과의 수 있도록 검색을 반환 ') 이들은 종종 여러 스레드에서 사용을 허용합니다. 나중에 호출됩니다 원래 함수에 함수를 제공

때 종종 결과 완료 (가 일부 스레드 풀에서 올 가능성이 있기 때문에이 콜백이 잘 정의되지 발생하는 스레드.

비동기 API를의 종종 복잡하다. 종종 필요한

뭔가 기적 다른 스레드에서 다른 함수를 호출 하나의 함수 호출을위한 것입니다. 일반적인 예는 호출에 의해 창에서 이벤트 루프 파견 스레드 위에 약간의 전화를 (밀수하는() 메소드).

시스템이 fork()에 해당하는 스레드를 제공 할 수 있습니다. 여기서 전체 스레드가 복제되고 (스택을 포함하여) 두 스레드가 함수에서 반환됩니다. 이 동작은 버그가 발생하기 쉽습니다.

Continuations은 달성하려는 작업을 수행 할 수있는 제어 방법을 제공 할 수 있지만 매우 복잡하며 달성하려는 대상의 가독성을 손상시킬 수 있습니다.

+0

Shuggy의 대답은 좋습니다. F # 메시지 전달에 대한 흥미로운 모델을보고 싶다면 다음을 참조하십시오. http://strangelights.com/blog/archive/2007/10/24/1601.aspx 이것은 Erlang 통신 인프라를 에뮬레이션하고 좋은 데모를 제공합니다 스레드 사용. – Godeke

0

.NET 비동기 대리자를 사용하면 별도의 스레드에서 실행되는 함수에 개체를 전달하고 완료되면 콜백 함수를 실행할 수 있습니다. 이 콜백 함수는 주 스레드와 다른 스레드에서 호출됩니다.

C# 또는 Visual Basic에 익숙한 경우 .NET에서 비동기 대리자를 사용하는 방법에 대한 많은 정보를 찾을 수 있습니다. 나는 F #에서 비동기 대의원들을 잘 대우하지 못했다.

관련 문제