sorunu

2016-03-24 28 views
1

Bir denetleyici var. Bir gen_server olan çocuktan child_specs alıyorum. Bunu ilk olarak tek bir yönetici - çocuk ilişkisi için yazdım. Daha sonra bu denetçinin birçok çocuk kurmasını istedim. Ama ben gen_server çocukta devlet olarak bazı ets tabloları var.sorunu

 exception exit: {shutdown, 
        {failed_to_start_child,bench_client2, 
         {badarg, 
          [{ets,new,[config,[set,named_table]],[]}, 
          {bench_client,init,1, 
           [{file,"bench_client.erl"},{line,59}]}, 
          {gen_server,init_it,6, 
           [{file,"gen_server.erl"},{line,306}]}, 
          {proc_lib,init_p_do_apply,3, 
           [{file,"proc_lib.erl"},{line,237}]}]}}} 

ben ets paylaşıldığı için gözetmen ikinci çocuk init fonksiyonu gittiğinde, zaten bir gördüğünü tahmin ediyorum: gözetmen neye istisna atıyor ikinci çocuğu yaratmaya çalışıyor ne zaman ets tablosu ve böylece istisna ama nasıl olsun emin değilim. Yine de sadece bir tahmin. Ben çocuktan çocuk spesifikasyonları alıyorum nasıl

Bu

olduğunu gen_server

child_specs() -> 
[begin 
Name = list_to_atom(?MODULE_STRING ++ integer_to_list(Index)), 
{Name, {?MODULE, start_link, [Name]}, 
    transient, 2000, worker, [bench_client]} 
end || Index <- lists:seq(1, 20)]. 
gen_server ait

init() işlevi

init([]) -> 
Config = ets:new(config, [set, named_table]), 
Destinations = ets:new(destinations, [set, named_table]), 

Ben erlang tam bir acemi değilim ve böylece sahip olduğu zor zaman.

Teşekkür ederiz!

cevap

2

Gerçekten adlandırılmış ets tablolarına ihtiyacınız var mı? Bir tabloyu adlandırdığınızda, bir Erlang düğümünde bu ada sahip yalnızca bir tablo bulunabilir. ets:new/2 aramanızdan named_table seçeneğinden kurtulun ve artık badarg istisnasını almayacaksınız.

+0

ve çalıştı. :) teşekkürler @Steve Vinoski. – root

+0

ets tablosu paylaşılır ve erlang vm'de yaşıyorsa, ilk çocuk ets tablosunu oluşturduğunda ve ikinci çocuk yeni bir tane oluşturmaya çalışırken, neden bir istisna atar? Teşekkür ederim! @Steve – root

+0

Cevabım uyarınca 'named_table' seçeneğini kullanmıyorsanız, iki çocuk işlemi iki farklı et tablosu oluşturuyor. Örneğin, 'erl' komutunu çalıştırırsanız ve 'et'leri çalıştırırsanız: new (config, [set]). İki çağrıdan dönen tablo kimlikleri farklı olacak. –

1

özel

yalnızca sahibi süreci okumak veya tabloya yazabilir.

ets:new(config, [set, named_table, private])?

+0

no .. Denendi ancak aynı hata. ayrıca, meraktan, özel ise, diğer çocuklar masaya nasıl erişebilir? ama teşekkür ederim! – root