2017-11-09 10 views
1

무해하게 많은 future을 관찰하는 방법을 찾고 있습니다. N future을 기다리기 위해 N 개의 스레드를 차단하지 않고 말입니다.clojure.core.async/go에서 미래/약속을 참조 할 수 있습니까?

나는 core.async 라이브러리가 블로킹 작업을 통해 스레드를 차단하지 않는 방식으로 빌드되지만이를 유지하고 스레드를 재사용한다는 것을 알 수 있습니다. 그것은 deref의 경우입니까, 아니면 <!alts!으로 만 작동합니까?

+0

이동 블록에서이 작업을 수행하는 방법에 대해 질문하는 것처럼 제목이 들리며 이동 블록을 사용하지 않고 미래를 위해이 작업을 수행하는 방법을 묻는 것처럼 질문이 들립니다. 너 찾고있어? –

+0

@ArthurUlfeldt deref를 기다리는 것으로 차단 된 스레드 *로 끝나지 않는 방법을 찾고 있습니다. – desudesudesu

+0

클로 지어의 선물을 사용해야합니까? 나는 실제 사용에서 그것들을 전혀 피할 것이다. 'ztellman/manifold' 라이브러리와 같은 다른 방법을 사용하십시오. – ClojureMostly

답변

2

future-done? 기능에서 조회 할 준비가되어있는 것을 볼 수 선물의 배열을 폴링 할 수 있습니다 : 당신은 아마도 벡터에 그 여론 조사의 모든 선물 기능을 (만들 수 있습니다

main> (future-done? (future 42)) 
true 
main> (future-done? (future (Thread/sleep 1000) 42)) 
false 

) 하나에 대한 작업을 누른 다음 가서 작업을 수행합니다. 대신 미래를 스레드를 차단하는이 방법은 당신이 원하는 경우

(일반적으로 선택이 한 번에 하나씩), 당신은 어떤 미래에 스레드를 차단하고 당신이 원하는 얼마나 많은 같은 노동자 결정 보다 효율적이거나 표현력이 뛰어나며 상태를 확인하고 어떤 미래를 확인하고 작업하여 자신의 버전 clojure.core.async/alts!을 다시 만들 수있는 길을 열어 주며 core.async를 사용하는 것이 더 나은지 추적 할 수있는 상태 시스템을 만들 것입니다 .

+0

그래서 최선의 접근 방식은 완료 여부에 관계없이 모든 미래를 지속적으로 검사하는 별도의 스레드를 사용하는 것일 수 있습니다. 그것이 작동하는 동안, 그것은 어떻게 든 깨끗한 해결책으로 보이지 않습니다. – desudesudesu

+0

이 질문에 대한 답변을 추가했습니다. –