2010-12-15 7 views
32

저는 GHC의 새로운 IO 관리자에 대해 읽었습니다. GHC는 비동기 이벤트 알림을 사용하고 높은 처리량을 달성하기 위해 I/O 차단을 피합니다.GHC IO 관리자는 어떤 IO 작업을 지원합니까?

새 비동기 IO 코드가 관리 할 수있는 IO 작업은 무엇입니까? 파일 및 네트워크 활동 읽기 및 쓰기? 데이터베이스 액세스? 관리자가 차단에 의존해야하는 일종의 IO가 있습니까?

+2

와우 ... 4 즐겨 찾기 하나만 upvote. 이상하다. – fuz

+0

@FUZxxl StackOverflow 님이 즐겨 찾기를 추가하셨습니까? 나는 단지 당신의 의견 때문에 그것을 알아 차렸다. – alternative

+0

@monadic 예, 있습니다. 좋아하는 질문 바로 아래의 시작 버튼을 누르십시오. 어떤 것이 바뀌면 마치 자신의 질문 인 것처럼 통보를받습니다. – fuz

답변

26

epoll/kqueue으로 관리 할 수있는 파일 설명자가 적합합니다. I의 비동기 처리를 원하는 라이브러리/O 재 시도하기 전에 시스템 호출을 GHC.Conc에서 threadWaitReadthreadWaitWrite 함수를 호출

  • 비 블로킹 파일 설명을하고,
  • 하여 I/O 관리자와 협력 할 필요가 이전에 EWOULDBLOCK을 반환했습니다.

이것은 이미 HandleSocket 유형에 대해 수행되었습니다. 예를 들어 C 데이터베이스 라이브러리에 대한 바인딩은 해당 라이브러리가 I/O 관리자와 협력하지 않으므로 블로킹 동작을 가져옵니다.

+8

'tibbe '가 아마 *이 * 영역에있는 * 알고있는 사람이라는 것을 알아 두십시오. :) –

5

다소 만족스러운 답변은 :

새로운 GHC IO 관리자의 핵심은 kqueue()/epoll() 이벤트 루프입니다. 따라서 나는 자격을 갖추기 위해 위에 구축 될 수있는 것을 기대할 것입니다. 특히이 의미

  • 파일 IO
  • 네트워크 IO를

코드 (나는 몇 달 전에 그것을보고와 상황이 변경되었을 수) 다양한의 시간 제한을 등록하고 실행에 대한 지원이 포함되어 있습니다 우선 순위 (검색) 대기열을 통해 종류. 이는 대부분의 sleep과 같은 호출이 인터페이스에서 피기 백이 될 수 있음을 의미합니다.

데이터베이스 액세스 정보 : 네트워크 IO 소켓을 통해 데이터베이스에 자주 액세스하므로 forkIO을 호출하고 별도의 스레드에서 DB 액세스를 수행하는 것이 빠르고, 안전하고 안전해야합니다. 데이터를 다른 응용 프로그램과 다시 통신하려면 동시성 (concurrency) 방법 인 Chan 또는 STM.TChan 중 하나를 사용합니다.

관리자가 블록킹에 의존해야하는 IO 종류가 있다고 생각하지 않지만 일부 라이브러리가 새로운 IO 관리자를 우회하여 경정맥을 바로 잡을 수 있다고 생각할 수 있습니다. 그들은 물론 차단할 것입니다.