2010-08-05 20 views
5

Erlang NIFs'deki thread'lerle ilgili küçük bir sorunum var. Kodumu buradan görüntüleyebilirsiniz: http://pastebin.com/HMCj24Jp. Sorun şu ki, iş parçacığı başlatırken bazı argümanlar alır ve generate_binary işlevini başlatır. Bu tamam, ama her şeyi çökerten argümanları okumaya çalışırken. Bu belki de en karmaşık problem değil, fakat bu konuda herhangi bir belge bulamadım, bu yüzden bazılarınızın cevabı bilmesini umuyorum.Erlang NIF ve thread ile ilgili sorunlar

cevap

9

Sizin generate_buffer() NIF, generate_binary() numaralı telefonu aramak için bir konu oluşturmaktan gurur duyar, ancak çağıran NIF yeni oluşturulan içeriğin bitirilmesini beklememektedir. Sadece iş parçacığı genel olarak olduğu gibi, iş parçacığı oluşturulur ve muhtemelen NIF döndürdüğü zaman çalışır. Muhtemelen generate_binary(), generate_buffer() geri döndükten sonra, kötü şeyi korkunç bir şekilde karıştırdıktan sonra, Erlang run-time sistemine çağırmaya çalıştığı için, Erlang BEAM emülatörünü çökertiyorsunuz.

Şimdi, istediğiniz şeyi yapmak için bunu düzelttiğiniz varsayılsa bile, burada açık yerel iş parçacıklarını kullanmanız gerektiğini düşünmüyorum. İlk olarak, Erlang NIF'lerinin, yalnızca farklı bir dilde yazılmalarıyla farklılık gösteren, düzenli Erlang fonksiyonları gibi görünmeleri gerekiyor. Erlang işlevleri, ayrı bir yürütme iş parçacığı üretmez, ardından geri dönüp, bu iş parçacığı çalışır durumda bırakmaz. I/O ve kalıcı veri depolama ile ilgilenenler hariç, Erlang fonksiyonları deterministik ve referentially transparent. NIF'iniz de değil. Yani, işe yaramasa bile, deneyimli bir Erlang programcısının beklentilerini ihlal ettiği için hala "yanlış".

İkincisi, çok işlemeye ihtiyacınız varsa, Erlang zaten süreçler hakkında fikir verir. NIF'iniz çok işlemciden faydalanabileceği kadar çok iş yaparsa, NIF'inizi yeniden işlemeyin, bu nedenle verilerin bir alt kümesi üzerinde çalışabilir, sonra birkaç kez Erlang işlemlerinin her biri için bir defaya mahsus olarak söyleyin. O zaman açık yerel konulara ihtiyacınız yoktur; BEAM emülatörü, sizin için en uygun iplik sayısını, şeffaf olarak yaratacaktır.

Üçüncü olarak, iş parçacığının ömrü yalnızca gerçekte amaçlanmış göründüğü gibi tek bir Erlang NIF çağrısı sırasında genişlerse, iş parçacığı oluşturma yükü performansı düşecek. Bu, Erlang süreçlerinin burada daha verimli olacağının bir başka nedenidir.