2014-07-08 2 views
1

나는Erlang의 프로세스를보다 효율적으로 생성하는 방법은 무엇입니까?

check_requests(Timestamp,Plan,AddInfo)-> 
    {Day,_Month,_Year,Hour,Minute,Second,Micro} = Timestamp, 
    ExpiredRequests = lists:filter(fun(Elem) -> 
           {_ID,Time,_Key,_Action} = Elem, 
           Time < {Day,Hour,Minute,Second,Micro} 
           end, Plan), 
    NewPlan = Plan -- ExpiredRequests, 
    make_requests(ExpiredRequests,AddInfo), 
    NewPlan. 

make_requests([],_)->ok; 
make_requests([ExpiredRequest|Rest],AddInf)-> 
    {_ID,_Time,Key,Action} = ExpiredRequest, 
    spawn(?MODULE,request,[AddInf,Action,Key]), 
    make_requests(Rest,AddInf). 

주요 아이디어는 내가 각각의 요청이 만료 될 때 시간을 부여하고 실행해야 계획을 가지고있다이 두 가지 기능을 가지고 있습니다. 만료시, 시간이 만료 될 수있는 다른 요청과 동시에 요청을 실행하여 새 프로세스로 요청 기능을 생성합니다. 자, 내가 수백만 건의 요청을한다면, 나는 수백만 가지의 프로세스를 갖게 될 것이고 나는 그것이 바람직하지 않다고 생각한다. 요청 실행은 최대 1 분 동안 지속될 수 있습니다. 내가 생성 한 함수가 끝나면 프로세스가 어떻게되는지 알고 싶습니다. 살해 됐나요? 또는 여전히 존재하고 가비지 수집해야합니까? 나는 동시 요청이 필요하고 어떻게 구현할 수 있을지 전혀 모른다. 또한이 경우 도움이 될 수있는 OTP 동작이 있습니까? 아직 OTP를 공부하지는 않았지만 얼랭 (Erlang) 프레임 워크의 중간에 있습니다.

답변

2

함수 생성이 끝나면 생성 된 프로세스가 종료됩니다. 쓰레기 수거 할 필요가 없습니다. 전체 프로세스 힙이 할당 해제됩니다. (공유 힙에 보관되는 64 바이트 이상의 바이너리 제외)

코드에 대한주의 사항 : 긴 목록을 특정 조건자를 만족하는 요소와 그렇지 않은 요소로 분리해야하는 경우, lists:partition/2을 사용하는 것이 lists:filter을 사용한 다음에 --을 사용하는 것보다 효율적입니다. 전자는 목록의 길이에 선형 시간으로 실행되지만, 불행한 경우 --은 2 차 시간에 실행될 수 있습니다.

1

동시에 발생하는 백만 건의 요청 중에서 최악의 시나리오 (귀하의 질문/요구 사항에서 이해 한 것)를 고려하면 일괄 적으로 처리하는 것 이외에 다른 옵션이별로 없습니다.
1 프로세스 제한을 기본 32k에서 좀 더 합리적인 값으로 늘리십시오. (리소스 가용성 및 테스트 결과에 따라 다름) 한 번에 만료 된 결과 (일부 오프셋 (기본값))를 처리합니다.
2. 여러 노드 (동일한 시스템/다른 시스템)에 프로세스를 배포 할 수있는 옵션이있는 경우 위의 방법을 사용할 수 있습니다. 그러나 동일한 머신의 여러 노드는 리소스 가용성에 따라 달라집니다.

erlang에서는 생성 된 프로세스에서 실행중인 함수가 종료되면 프로세스 자체가 종료됩니다.

2

작업은 완전히 "최대 힙/우선 순위 대기열"템플릿입니다. 목록을 필터링하는 것이 아니라 우선 순위가 가장 높은 요소를 팝핑하는 방식으로 해결해야합니다 (주어진 순간에 가까운 만료 날짜, 우선 순위가 더 높음) 우선 순위 큐에서 요소 추출시 O (1) 시간이 걸릴 것입니다. 모든 프로세스가 만료 된 경우에만 모든 대기열을 트래버스해야합니다.

또한이 대기열을 많은 양의 우선 순위 대기열 (가능한 경우 독립)로 분할하고 동시에 처리합니다.

그리고 Erlang에서는 다른 프로세스를 모니터링 할 수 있습니다 ("exit"코드보기). 또한 OTP 수퍼바이저를 사용하여 수행 할 수 있습니다.

관련 문제