2010-08-16 18 views
6

Tamam Bunu anlamak için her yolu deniyorum.Erlang - Global Variables .. evet Biliyorum, biliyorum

Bu tabloyu global hale getirmem gerekiyor .. Programım kapsamında TableID'i geçmek için çok daha az verimli olduğunu fark ettim.

TableID = ets:new(tb, [set,public]), 
put({tableUniqueID}, TableID), 
Sonra

kullandığım:

get({tableUniqueID}) 

Ve aynı işlevi gayet tableId döndürür ... henüz ne zaman

Yani o kadar seyir sonra yeni bir tablo oluşturma çalıştı Başka bir işlevde kullanın, tanımsız bir şekilde döndürür.

Ne ?? Dışarıda değil işleri işlevinde,

ets:lookup(get({tableUniqueID}), msgIn) 

aynı şeyi: Ben

AYRICA tüm bu önce aşağıdaki gibi bir tablo arama işlevi çağırmak "olabilir" fark .. olsun düşünce ve global bir anahtar yapılmış koymak .. Put Get sorun ..

Sonra masanın

ets:lookup(tb, msgIn) 

ait atom arayarak olacak bir tablo Arama için başka bir yol gerçekleştirilen Ama değil işlevi içinde değil çalışır asla bu Bu nedenle, benim asıl önceliğim, bir tablonun atomuyla niçin bir tabloya baktığını anlamak mümkün değildir. Ama el kitabı da dahil olmak üzere çoğu yerde olduğunu söylüyor.

Olmadan yaşayabildiğim/alın Tabanı depolayabildiğim sürece, tabloyu atom tanımlayıcısına göre arayın.

Bu ikilem üzerinde kim ışık tutabilir?

cevap

6

Ben GOT IT!

henüz iyi .. arama fonksiyonu altında bu derdi, dokümanlar İstek, ets öğreticiler yazar, ya da daha herkesin kitapların

böylece çözüm named_table olduğunu Yani

TableID = ets:new(tb, [set,public,named_table]) 

etmektir önemli

Bazı man sayfaları karıştırmaya kısmı vardır ancak

;)

4

Sorununuzun doğru yanıtı, genel bir tablo kullanmamak, ancak bunun yerine bilgi aktarmaktır. Özellikle orijinal sorunuzdaki verimden bahsettiğiniz için. Kodunuzda herhangi bir çok çekirdekli makinede daha kötü performansa neden olacak bir sıkışıklık noktası yaratıyorsunuz.

Ets tablosu, diğer tüm süreçlerin değer elde etmek için çağırması gereken bir süreç olarak uygulanır.

İlgili konular