Erlang'ı rpc arasındaki fark: multicall rpc vs / 4: pmap / 3

oy
0

Şu anda birden fazla düğümlerde bazı İksir kod çalıştıran deneme ve ben iki yöntem kullandım: 1) :rpc.multicall/4& 2) :rpc.pmap/3.

Hem çoklu düğümlerde kod çalıştırmasına ve ben bu aramaların sonuç farklı olduğunu (listedeki vs tuple) anladığınızı görebilirsiniz.

Ben eksik veya ediyorum ikisi arasında herhangi bir başka önemli farklılıklar bu iki işlev tek fark onlar denilen ve döndürülen değer nasıl olmanın eşdeğer var olan mı?

Şimdiden teşekkürler!

Oluştur 12/03/2017 saat 13:15
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

belgelerine.

:rpc.multicall/5

Bir multicall birden sunuculara bir istemciden eşzamanlı gönderilen bir RPC olduğunu. Bu düğüm veya bazı yan etkileri elde etmek için düğüm kümesi bir işlevi çağırmak için bir dizi bilgi toplamak için kullanılabilir.

:rpc.pmap/3

paralel olarak, List1 içinde her eleman Elem için | (Modül, Fonksiyon, [ExtraArgs Elem]) uygulamak değerlendirir. List1 içinde aynı sırada, dönüş değerlerinin listesini döndürür.

Yani multicall/5düğüm kümesi verilen tek işlevi çağırır. İlk eleman sonuçları listesi ve ikinci eleman herhangi bir nedenle işlevini tamamlamayan düğümlerin bir listesi nerede bir demet size geri verecektir.

Oysa pmap/3çağrı benzer olacaktır mapçalışma ya da farklı bir düğümde yapılabilir olmayabilir hariç. Sonuç listesi hâlâ başlangıç listesi ile aynı düzen var olacağını bilmek önemlidir.

Cevap 12/03/2017 saat 15:21
kaynak kullanıcı

oy
0

Bunlar, birbirinden gerçekten farklı

pmapbenzer bir harita gerçekleştirecektir :list.map(buradan daha fazla http://erlang.org/doc/man/lists.html ) Ama düğüm bağlı mevcuttur ve değerler üzerinde olduğu gibi bu çağrı sürece düğümler arasında olacağını avantajla haritayı gerçekleştirmek için sıralar.

multicallbaşka bir şekilde her zaman birden fazla düğüm aynı args ile aynı çağrıyı gerçekleştirir. multicall/4bağlı olan tüm düğümlerde aynı işlev çağrısını gerçekleştirir. multicall/5başında fazladan argüman alır, yani RPC çalıştırır düğümler listesidir.

Biz 3 kabukları oluşan bir küme daha iyi örneklendirir.Personel için

  • iex --sname node1
  • iex --sname node2
  • iex --sname node3

Ve bir biz yürütme node1 birbirine bağlamak

Node.connect :"node2@mymachine"
# => false
Node.connect :"node3@mymachine"
# => false

Biz 2 değerleri toplar ve bu işlem bu şekilde gerçekleştirildi düğüm ile değerini veren bir fonksiyonu tanımlayabilir:

iex(node1@mymachine)> defmodule Operation do
...(node1@mymachine)>   def sum(a, b), do: {Node.self(), a + b}
...(node1@mymachine)> end

Her kabuğun içinde bu işlevi tanımlamak gereklidir. Yani şimdi sadece birden çok değeri olan bizim pmap arayıp olacak ne olacağını görmek mümkündür. bilgisayarıma bu durumda olan node1 arıyorum.

iex(node1@mymachine)> :rpc.pmap {Operation, :sum}, [1], [1,2,3]
[node3@mymachine: 2, node2@mymachine: 3, node1@mymachine: 4]

Her bir düğüm için sum/2işlev farklı bir çıkış ile sonuçlanan, son pozisyonda farklı bir bağımsız değişken ile adlandırıldı. Benim son argüman ise :rpc.map/3daha az elemanları ile bir listedir o zaman bütün düğümlerin diyeceğiz gerekli değil mevcut düğümlerin. Ama gerekli olanları işlemi tamamlamak için. Ben bir çok fikri geçirirseniz o daha dengeli bir şekilde aramaları dönecektir. Sen çalıştırmak için deneyebilirsiniz :rpc.pmap {Operation, :sum}, [1], Enum.to_list 1..20her düğümünde ve kendiniz sonucunu görmek.

Kullandığımız diğer elinde :rpc.multicall/5Sen bağımsız değişkenlerin bir listesini geçmezken paralel olarak her biri yürütülecek, ama aynı argüman aynı anda birden fazla Nodlarındamİmmünohistokimyasal yürütülecek. Örneğin

iex(node1@mymachine)> :rpc.multicall(Operation, :sum, [2, 2], :infinity)
# => {[node1@mymachine: 4, node2@mymachine: 4, node3@mymachine: 4], []}

Geçen argüman bu zaman aşımı bu düğümün sonucu başlığın ilk listede göstermek için gitmiyor karşılanmaktadır eğer zaman aşımı, her düğümünde yürütülecek bu.

Ile :rpc.multicall/5bu mümkün bu çağrı ilk argüman olarak çalıştırılacaktır düğümlerin listesini iletmek için. Mesela ben sadece ben sadece yürütme herhangi düğüm içinde node2 ve Node3 içinde yürütmek istersen

iex(node1@mymachine)> :rpc.multicall([:"node2@mymachine", :"node3@mymachine"] Operation, :sum, [2, 2], :infinity)
# => {[node2@mymachine: 4, node3@mymachine: 4], []}

Fark bir şey olduğunu :rpc.multicall/4ve :rpc.pmap/3her iki eylem bir Düğüm olmadan çalışır, bunun nedeni bir yangın olduğunda erlangvm içindir iexveya erltek bir düğüm küme zaten.

Cevap 12/03/2017 saat 19:08
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more