2016-10-28 7 views
0

를 처리비약 "지는"

elixir loop.exs | wc -l 

을 그리고 후속 실행에를, 나는 40000 기대를 볼 수 있습니다 라인,하지만 덜 볼 수 있습니다. 내 테스트에서 나는 39752, 39934, 39673 등을 보았습니다. 이것은 특정 프로세스가 IO.puts으로 전화를 걸지 않는다는 것을 나에게 암시합니다. 그래서 그들에게 무슨 일이 일어나고 있는지, 왜 그들이 실종되었다고 경고하지 않았는지, 그리고 나는 이것을 잘못하고있는 무엇을하고 있는가?

답변

4

문제는 루트 수준에서 표현식을 평가 한 즉시 스크립트가 종료된다는 것입니다. 산란 프로세스가 비동기 적이기 때문에 Elixir는 4 만 번째 프로세스를 생성하자 마자 종료합니다. 보고있는 행 수는 40,000 번째 프로세스가 생성되기 전에 IO.puts 실행을 완료 한 프로세스 수입니다. 당신은 마지막에 조금 :timer.sleep/1 호출을 추가하여이를 확인할 수 있습니다 :이

Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end) 
:timer.sleep(500) 

을, 난 항상 출력의 40K 라인을 얻을. (IO.puts이 마지막 프로세스가 생성 된 후 500 밀리 초 이내에 실행되지 않는 경우이 수치는 작아집니다.)

+0

@ Fuser97381 이것은 완벽하게 유효한 답변이며 아바타 기본 설정에 대해 룸메이트와상의 할 수 있습니다. 여기에서 올바른 질문을 정정하자 마자 표시해야합니다. 운영자의주의를 환기 시켰습니다. – mudasobwa