2015-03-13 4 views
6

मैं इलीक्सिर का उपयोग कर समस्या को हल करने पर विचार कर रहा हूं, मुख्य रूप से बड़ी संख्या में प्रक्रियाओं को सस्ती रूप से बढ़ाने की क्षमता के कारण।क्या एलिक्सीर/एरलांग अपनी याददाश्त सहित एक प्रक्रिया की प्रतिलिपि बना सकता है?

मेरे परिदृश्य में, मैं कई "मूल" प्रक्रियाएं बनाना चाहता हूं, जो स्मृति में विशिष्ट, अपरिवर्तनीय डेटा लोड करते हैं, फिर आवश्यकतानुसार उन प्रक्रियाओं की प्रतियां बनाते हैं। प्रतियां सभी समान डेटा डेटा का उपयोग करेंगी, लेकिन इसके साथ-साथ केवल पढ़ने के लिए कार्य करें; उदाहरण के लिए, कल्पना करें कि एक "मूल" में स्मृति में "युद्ध और शांति" का पाठ है, और उस मूल की प्रत्येक प्रति पाठ पर एक अलग तरह का विश्लेषण करती है।

मेरे सवालों का:

  • यह एक मौजूदा प्रक्रिया, स्मृति सामग्री और सभी, अमृत/Erlang वीएम में कॉपी करने के लिए संभव है?
  • यदि हां, तो क्या प्रत्येक प्रति मूल के रूप में उतनी मेमोरी का उपभोग करती है, या क्या वे स्मृति साझा कर सकते हैं, क्योंकि यूनिक्स प्रक्रियाएं "लिखने की प्रतिलिपि" रणनीति के साथ होती हैं? (और इस मामले में, उसके बाद कोई राईट होगा।)
+0

प्रक्रियाएं साझा नहीं करती हैं, या बल्कि केवल सीमित सीमित प्रकार के डेटा हैं। बड़ी बाइनरी साझा की जाती हैं। – rvirding

+0

मुझे लगता है कि मैंने गलत सवाल पूछा होगा। वापस देखकर, मैं वास्तव में पूछना चाहता था "क्या मैं कुछ पठनीय डेटा लोड या निर्माण कर सकता हूं, कई प्रक्रियाओं को बढ़ा सकता हूं, और क्या वे सभी इसका उपयोग कर सकते हैं?" इसका जवाब है हाँ। उदाहरण के लिए, मैक्रो का उपयोग करके संकलन के दौरान डेटा को एलिक्सीर मॉड्यूल एट्रिब्यूट या फ़ंक्शन बॉडी में संग्रहीत किया जा सकता है, और स्पॉन्ड प्रक्रियाएं फ़ंक्शन को कॉल कर सकती हैं या रनटाइम पर विशेषता तक पहुंच सकती हैं। –

उत्तर

5

एक Erlang प्रक्रिया के अलावा क्या चर (और the process dictionary) में संग्रह किया गया है से कोई प्रक्रिया विशिष्ट डेटा, तो एक की स्मृति की एक प्रतिलिपि बनाने के लिए है प्रक्रिया, फ़ंक्शन के तर्क के रूप में सभी प्रासंगिक चरों को पारित करने वाली एक नई प्रक्रिया को उत्पन्न करें।

सामान्य रूप से, प्रक्रियाओं के बीच स्मृति साझा नहीं की जाती है; सब कुछ कॉपी किया गया है। अपवाद ईटीएस टेबल हैं (हालांकि प्रक्रियाओं को पढ़ते समय डेटा ईटीएस टेबल से कॉपी किया जाता है), और 64 बाइट्स से बड़ी बाइनरी। यदि आप बाइनरी में "युद्ध और शांति" संग्रहीत करते हैं, और इसे प्रत्येक कार्यकर्ता प्रक्रिया में भेजते हैं (या जब आप उन कार्यकर्ताओं की प्रक्रियाओं को जन्म देते हैं तो इसे पास करते हैं), तो प्रक्रियाएं स्मृति साझा करती हैं, केवल तभी इसे कॉपी करती हैं जब वे बाइनरी को संशोधित करना चाहते हैं । अधिक जानकारी के लिए Erlang दक्षता मार्गदर्शिका में chapter on binaries देखें।

+1

दिलचस्प। वास्तविक डेटा जो मैं साझा करना चाहता हूं वह एक शब्दकोश की तरह अधिक होगा, जहां कुंजी संख्याओं और मानों के सरणी हैं शब्दकोशों के सरणी हैं। क्या बाइनरी के माध्यम से साझा करना और उपयोग करना संभव होगा? (कुल नौसिखिया प्रश्नों के लिए खेद है, लेकिन मैं गहरी गोता लगाने से पहले व्यवहार्यता निर्धारित करने की कोशिश कर रहा हूं।) –

+2

मैं [ईटीएस टेबल] के साथ शुरू करूंगा (http://www.erlang.org/doc/man/ets.html)। जब आप इसे ईटीएस तालिका से पढ़ते हैं तो डेटा की प्रतिलिपि बनाई जाएगी, यदि आप केवल उसी समय एक हिस्से को देख रहे हैं तो कार्यकर्ता प्रक्रिया कचरा संग्रह को बनाए रखने में सक्षम होना चाहिए। – legoscia

+2

मैं ईटीएस के साथ भी जाऊंगा या मांग पर अन्य प्रक्रियाओं को प्रासंगिक डेटा भेज सकता हूं। हालांकि, यदि आप बेंचमार्क करते हैं और यह वास्तव में एक प्रदर्शन समस्या है, तो आप अपने कुंजी-मान को एक बड़ी बाइनरी के रूप में एन्कोड कर सकते हैं और प्रत्येक प्रक्रिया से वहां से जानकारी निकाली जा सकती है। आईआईआरसी, क्रेस्टन इस तकनीक का उपयोग अपने हनोईडीबी अनुप्रयोग में करता है: https://github.com/krestenkrab/hanoidb –

6

प्रक्रियाओं की प्रतिलिपि बनाने के लिए कोई अंतर्निहित तरीका नहीं है। ऐसा करने का सबसे आसान तरीका "मूल" प्रक्रिया और "प्रतियां" शुरू करना है और प्रतियों में संदेशों में सभी प्रासंगिक डेटा भेजना है। प्रक्रियाएं डेटा साझा नहीं करती हैं इसलिए ऐसा करने का कोई और अधिक प्रभावी तरीका नहीं है। ईटीएस टेबल में डेटा डालने से केवल आंशिक रूप से साझा करने में मदद मिलती है क्योंकि ईटीएस टेबल में डेटा को इस्तेमाल होने पर प्रक्रिया में कॉपी किया जाता है, हालांकि, आपको प्रक्रिया ढेर में सभी डेटा रखने की आवश्यकता नहीं है।

1

आप यूनिक्स प्रक्रियाओं के समान Erlang/Elixir प्रक्रियाओं के बारे में सोच रहे हैं। वे बिल्कुल नहीं हैं, मैं वास्तव में चाहता हूं कि उनका एक अलग नाम हो, क्योंकि वे वास्तव में मानक यूनिक्स अर्थ में धागे या प्रक्रिया नहीं हैं। मुझे अंतर के चारों ओर अपने सिर को लपेटने में कुछ समय लगा।

आपको प्रक्रियाओं के बारे में अपने सभी पूर्वकल्पित विचारों को फेंकना होगा, वे सभी गलत हैं। Eprocesses में निम्नलिखित विशेषताएं हैं।

  • वे सस्ते और तेज़ हैं। बहुत कुछ प्रयोग करें, हमेशा और भी होते हैं।

  • वे कोई संसाधन नहीं साझा करते [1]। (यहां तक ​​कि stdout को लिखना एक अन्य ईप्रोसेस का संदेश है।)

  • आईपीसी (या संदेश) मानक यूनिक्स आईपीसी की अपेक्षा अपेक्षाकृत कम ओवरहेड के साथ बहुत तेज हैं।

क्या मैं अपने मामले में की कोशिश करेंगे एक सर्वर है कि डेटा में कामयाब बना सकते हैं और प्रत्येक विश्लेषण कार्यकर्ता संदेश डेटा हिस्सा इसकी आवश्यकता है कि के लिए सर्वर है।यह एक स्वीकार्य है कि एक ईप्रोसेस साझा स्मृति के प्रबंधक को कम या कम हो।

मेरे लिए प्रोप्रोसेस के बारे में सोचने का सबसे उपयोगी तरीका निष्पादन के अपने धागे के साथ वस्तुओं के रूप में है।

[1] ठीक है, ईटीएस तालिका है, लेकिन उनको सोचना सबसे अच्छा है जब तक कि आपको संसाधनों को साझा न किया जाए।

+0

वे प्रक्रियाएं हैं, बस यूनिक्स प्रक्रिया नहीं। यूनिक्स की तुलना में अन्य सिस्टम हैं। :-) – rvirding

+0

असल में मैं शायद बीएएम का उपयोग करने के सीखने के एक और वर्ष के बाद उस प्रश्न का काफी अलग जवाब दूंगा। –

+0

हाँ ईटीएस टेबल वास्तव में साझा नहीं किए जाते हैं। वे विश्व स्तर पर पहुंचने की तरह अधिक हैं क्योंकि जब आप उन्हें एक्सेस करते हैं तो टेबल और आपकी प्रक्रिया के बीच डेटा की प्रतिलिपि बनाई जाती है। संकल्पनात्मक रूप से उन्हें प्रक्रिया की स्थिति होने की तरह, लेकिन वे अलग-अलग लागू किए जाते हैं। – rvirding

संबंधित मुद्दे

 संबंधित मुद्दे