Qt 클라이언트에서 Erlang 서버에 데이터베이스 페이지 조회 요청 (1)

2156 단어 erlangpidets
사용자가 서버에 검색 연락처를 요청할 때 검색 결과는 매우 큰 데이터일 수 있으므로 반드시 페이지를 나누어 클라이언트에게 전달해야 한다.현재 조회에서 데이터베이스 조회를 담당하는 프로세스는 중단할 수 없습니다. 사용자가 다음 페이지를 요청할 때 이 프로세스가 완성해야 합니다.이 프로세스도 시간 초과를 유지해야 한다. 사용자가 일정 시간 동안 새로운 검색 요청이 도착하지 않거나 검색 데이터가 데이터베이스 끝에 도착하면 이 검색 프로세스를 끝내야 한다.
모든 사용자 계정은 유일하게 하나의 검색 프로세스에 대응하고 ets표로 사용자 계정 Acc와 그에 대응하는 동적 창설된 검색 데이터베이스의 프로세스 Pid 간의 매핑 관계를 관리한다.디자인할 때 사용자 계정을 사용하여 원자로 전환하고 원자로 등록 프로세스를 구축하는 것을 고려했지만 Erlang 시스템에서 원자가 회수되지 않고 동적으로 대량의 원자를 만드는 것은 메모리의 유출을 초래할 수 있다는 점을 고려해 이런 디자인을 포기했다.현재 디자인은 사용자 계정과 대응하는 검색 프로세스의 Pid를 ets표에 기록하여 사용자가 요청할 때 이 ets표에서 대응하는 검색 프로세스의 Pid를 얻을 수 있도록 합니다.(그러나 이 설계의 결함은 AccPid 매핑 관계를 저장하는 프로세스가 충돌하면 연락처를 검색하는 모든 사용자가 영향을 받을 수 있기 때문에 앞으로 더 좋은 해결 방안이 있기를 바란다는 것이다.)
생각이 정리되어 지금부터 공사를 시작한다.
이 모듈은 OTP 프레임워크를 사용할 수도 있고 사용하지 않을 수도 있습니다.그러나 공사의 건장성을 위해 OTP 행위 모델을 사용하면 감독자의 관리에 포함시킬 수 있다.
cs_accToSearchDBPid.erl
-module(cs_accToSearchDBPid).
-behaviour(gen_server).
-export([
	start_link/0,
	insert/2,
	lookup/1,
	delete/1
	]).
-export([
	init/1,
	handle_call/3,
	handle_cast/2,
	handle_info/2,
	terminate/2,
	code_change/3
	]).
-define(SERVER,?MODULE).
-define(TABLE_ID,?MODULE).

start_link()->
    gen_server:start_link({local,?SERVER},?MODULE,[],[]).

insert(Acc,Pid)->
    gen_server:cast(?SERVER,{insert,{Acc,Pid}}).

lookup(Acc)->
    gen_server:call(?SERVER,{lookup,Acc}).

delete(Pid)->
    gen_server:cast(?SERVER,{delete,Pid}).

init([])->
    ets:new(?TABLE_ID,[private,named_table,set]),
    {ok,state}.

handle_call({lookup,Acc},_,State)->
    Value=ets:lookup(?TABLE_ID,Acc),
    {reply,{ok,Value},State}.

handle_cast({insert,{Acc,Pid}},State)->
    ets:insert(?TABLE_ID,{Acc,Pid}),
    {noreply,State};
handle_cast({delete,Pid},State)->
    ets:match_delete(?TABLE_ID,{'_',Pid}),
    {noreply,State}.

handle_info(_,State)->
    {noreply,State}.

terminate(_Reason,_State)->
    ok.

code_change(_OldVsn,State,_Extra)->
    {ok,State}.

cs_accToSearchDBPid 모듈에서 3개의 인터페이스 함수를 내보냅니다. insert는 새로운 Acc-Pid 쌍을 삽입하고lookup은 Acc 조회를 통해 대응하는 프로세스 Pid입니다. delete는 Acc-Pid 쌍을 삭제합니다.
구체적인 조회 프로세스 모듈은 다음 문장을 보십시오.

좋은 웹페이지 즐겨찾기