[Erlang] - два способа работы с потоком
От: DemAS http://demas.me
Дата: 16.02.09 10:52
Оценка:
Есть вот такой код:

register_db_server()->
    register(db_serv, start_db_server()).

start_db_server()->
    spawn(fun prepare_db_server/0).

prepare_db_server()->
    loop_db_server(dict:new()).
    
loop_db_server(GlobalDict)->
    receive
    {From, {dict, Dict}} ->
            io:format("uuuuu~n"),
        From ! {self(), "done"},
        io:format("ooooo~n"),
        loop_db_server(Dict);
    {From, {finish}}->
        io:format("db_sever shutdown~n");
end.

db_rpc(Pid, Dict)->
    Pid ! {self(), Dict},
    io:format("rpc sent~n"),
    receive
    {Pid, Responce}->
        io:format("rpc responce~n"),
        Responce
    end.

process_dict(Pid, Dict)->
    db_rpc(Pid, Dict),
    io:format("end process~n").

print_result(Pid)->
    db_rpc(Pid, {print}).

shutdown_db_server(Pid)->
    db_rpc(Pid, {finish}).

create_test_dict()->
    D1 = dict:new(),
    D2 = dict:store("a", 5, D1),
    D3 = dict:store("b", 2, D2),
    D4 = dict:store("c", 1, D3).

test()->
    register_db_server(),
    D = create_test_dict(),
    process_dict(db_serv, {dict, D}),
    process_dict(db_serv, {dict, D}),
    shutdown_db_server(db_serv).    

test2()->
    Pid = start_db_server(),
    D = create_test_dict(),
    process_dict(Pid, {dict, D}),
    process_dict(Pid, {dict, D}),
    shutdown_db_server(Pid).


Если вызвать test2(), то получим следующий результат:

2> db_server:test2().
rpc sent
uuuuu
ooooo
rpc responce
end process
rpc sent
uuuuu
ooooo
rpc responce
end process
rpc sent
db_sever shutdown


Все работает. Единственное — не появляется приглашение "3>". Просто
процесс висит. Почему и как победить?

Если же выполнить test(), то результат будет таким:

2> db_server:test().
rpc sent
uuuuu
ooooo


То есть, все "повиснет" гораздо раньше. Почему так происходит и как
забороть?
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.