2012-09-17 3 views
1

다트에서 동일한 분리에 대해 여러 개의 송신 및 수신 포트를 열 수 있습니까?Dart Isolates에 대해 여러 개의 송수신 포트를 사용할 수 있습니까?

예. 다음의 코드 샘플은 각각 자신의 송신 포트가있는 두 개의 격리를 만들었을 것입니다. 그러나 동일한 격리에 대해 하나 이상의 보내기/받기 포트를 만들고 메시지를 보낼 수신 포트를 선택하는 방법이 있는지 궁금합니다.

#import('dart:isolate'); 

    echo() { 

    } 

    main() { 
     var sendPort1 = spawnFunction(echo); 
     var sendPort2 = spawnFunction(echo); 
    } 
+0

동일한 분리에서 두 SendPorts를 사용하는 위치를 명확히 할 수 있습니까? 'sendPort'를 클래스 나 함수가 고립시켜야 할 곳으로 전달할 수는 없습니까? –

답변

1

여러 수신 포트에 대해 잘 모르겠지만. 수신 포트마다 여러 개의 송신 포트를 만들 수 있습니다. ReceivePort.toSendPort

도움의 하단에 표시된 바와 같이 :

같은 ReceivePort에서 여러 SendPorts를 만드는 합법적이 기능은 ReceivePort 클래스로 구축이다.

희망이 도움이됩니다.

3

실제로 ReceivePort 당 여러 개의 SendPorts를 생성 할 수 있습니다.

기본적으로 격리 주체를 포함하는 격리자는 ReceivePort를 만들고 port 게터를 통해 사용할 수 있습니다. 이 ReceivePort는 spawnFunction()spawnUri()에서 반환 된 SendPort에 연결됩니다. 그러나 new ReceivePort()으로 새 ReceivePort를 만들면 toSendPort()을 통해 원하는 수만큼 연결된 SendPorts를 만들 수 있습니다. 그들을 사용하기 위하여 당신은 당신이 spawnFunction()에서 또는 ReceivePort.receive()를 통해 얻은 원래 SendPort에 메시지와 함께 새로운 SendPort 자체를 보낸다.

이렇게하면 두 격리 지점 사이에 여러 "채널"을 설정할 수 있습니다. 아직 실제로 어떻게 작동하는지 아직 보지 못했지만 하나의 SendPort에서 구조화 된 메시지를 통해 채널을 멀티플렉싱하고 있습니다.

격리 된 곳에서 ReceivePort를 만들 수 있습니다 : 부모 격리 또는 자식 격리. 그러므로 분파자가 2 개의 SendPorts를 자식에게 보내려면 spawnFunction()에서 하나를 필요로하고 다른 하나는 메시지에서 자식으로부터 부모로 다시 전달해야합니다.

다음은 여러 개의 SendPorts를 사용하도록 변경 한 예입니다. 단계 :

  1. 주 : 스폰 분리
  2. 주요 다음 분리 다시
  3. 에코 메시지를 보낼 수 있도록 SendPort있는 메시지를 보내기 다음 분리
  4. 에코에 두 번째 ReceivePort 만들기 하십시오 ReplyTo의 SendPort
  5. 에코와 분리에 메시지가 나타납니다 ReceivePort에서 SendPort을 만들고 다시 보내
  6. 주 :
  7. 에코에서 메시지와 SendPort 수신

이제 main()에는 독립된 두 개의 SendPorts가 있습니다.

#import('dart:isolate'); 

echo() { 
    var port2 = new ReceivePort(); // 3 

    port2.receive((m, p) { 
    print("two: $m"); 
    }); 

    port.receive((m, p) { // 4 
    print("one: $m"); 
    p.send("ack", port2.toSendPort()); // 5 
    }); 
} 

main() { 
    port.receive((m, sendPort2) { // 6 
    sendPort2.send("hello 2"); 
    }); 
    var sendPort1 = spawnFunction(echo); // 1 
    sendPort1.send("hello 1", port.toSendPort()); // 2 
} 

이 인쇄 :

one: hello 1 
two: hello 2 

휴!

0

저스틴의 대답은 기본적으로 옳았지만 5 단계가 실행 된 후 격리가 응답을 중지했기 때문에 약간의 문제가 발생했습니다.

import 'dart:isolate'; 

echo() { 
    var port2 = new ReceivePort(); 

    port2.receive((m, p) { 
    print("two: $m"); 
    }); 

    port.receive((m, p) { 
    print("one: $m"); 
    p.send(port2.toSendPort()); 
    }); 
} 

main() { 
    var sendPort1 = spawnFunction(echo); 
    sendPort1.call("hello 1").then((newPort)=>newPort.send("hello 2")); 
} 

가장 큰 차이점은 포트가 ReplyTo의 필드를 사용하는 대신 메시지로 전송되는 것을 단순히 : 그래서 여기에 실제로 내 상황에서 일 업데이트 된 버전입니다. 또한 다른 수신 포트가 필요하지 않으므로보다 컴팩트 한 코드를 사용할 수 있습니다.

관련 문제