2011-06-17 14 views
5

मैं लुआ में एक प्रोग्राम लिखने में सक्षम नहीं हूं जो एक से अधिक CPU लोड करेगा। चूंकि लुआ supports the concept via coroutines, मेरा मानना ​​है कि यह प्राप्त करने योग्य है। मेरे लिएलुआ :: सरल प्रोग्राम कैसे लिखें जो एकाधिक सीपीयू लोड करेगा?

कारण नाकाम रहने में से एक हो सकते हैं:

  • यह लुआ
  • में संभव नहीं है मैं इसे ☺ लिखने में सक्षम नहीं कर रहा हूँ (और मैं आशा यह मामला है)

क्या कोई और अनुभव कर सकता है (मैंने दो सप्ताह पहले लूआ की खोज की थी) मुझे सही दिशा में इंगित करता है?


The point is to write a number-crunching script that does hi-load on ALL cores... लुआ की शक्ति का प्रदर्शन-परक प्रयोजनों के लिए ।

धन्यवाद ...

उत्तर

7

लुआ coroutines पर एक नज़र डालें ऑपरेटिंग सिस्टम अर्थ में धागे के रूप में एक ही बात नहीं कर रहे हैं।

ओएस थ्रेड्स प्रीपेप्टिव हैं। इसका मतलब है कि वे मनमाने ढंग से समय पर चलेंगे, ओएस द्वारा निर्धारित टाइमलाइसेस चोरी करेंगे। यदि वे उपलब्ध हैं तो वे विभिन्न प्रोसेसर पर चले जाएंगे। और वे एक ही समय में जहां भी संभव हो सकते हैं।

लुआ कोरौटाइन्स ऐसा नहीं करते हैं। Coroutines प्रकार "धागा" हो सकता है, लेकिन एक बार में केवल एक कोरआउट सक्रिय हो सकता है। एक कोरआउटिन तब तक चलेगा जब तक कोरआउट स्वयं coroutine.yield कमांड जारी करके दौड़ना बंद कर देता है। और एक बार यह पैदा होने के बाद, यह तब तक नहीं चलेगा जब तक कि कोई अन्य दिनचर्या उस विशेष कोरआउटिन को coroutine.resume कमांड जारी न करे।

लुआ coroutines सहकारी बहु सूत्रण, जिसके कारण वे सह दिनचर्या कहा जाता है प्रदान करते हैं। वे एक-दूसरे के साथ सहयोग करते हैं। एक समय में केवल एक चीज चलती है, और जब आप कार्य स्पष्ट रूप से ऐसा करते हैं तो आप केवल कार्य स्विच करते हैं।

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

सभी लू थ्रेडिंग मॉड्यूल मौजूद हैं जो प्रत्येक धागे के लिए वैकल्पिक लुआ उदाहरण बनाते हैं। Lua-lltreads बस प्रत्येक धागे के लिए एक पूरी तरह से नया लुआ उदाहरण बनाता है; नए धागे को पारित पैरामीटर की प्रतिलिपि बनाने के बाहर थ्रेड-टू-थ्रेड संचार के लिए कोई एपीआई नहीं है। LuaLanes कुछ क्रॉस-कनेक्टिंग कोड प्रदान करता है।

6

यह संभव कोर लुआ पुस्तकालयों के साथ (यदि आप कई प्रक्रियाओं बनाने और इनपुट/आउटपुट के माध्यम से संपर्क में नहीं आती हैं) नहीं है, लेकिन मुझे लगता है कि अलग अलग सूत्रण पुस्तकालयों के लिए लुआ बाइंडिंग देखते हैं वहाँ से बाहर।

answer from jpjacobs to one of the related questionsLuaLanes से लिंक, जो एक बहु थ्रेडिंग लाइब्रेरी प्रतीत होता है। (हालांकि, मुझे कोई अनुभव नहीं है।)

यदि आप किसी एप्लिकेशन में लुआ को एम्बेड करते हैं, तो आप आमतौर पर मल्टीथ्रेडिंग को अपने अनुप्रयोगों से जुड़े किसी भी तरह से मल्टीथ्रेडिंग करना चाहते हैं।

1

पहले से ही सुझाए गए लुआलेन्स, लोथ्रेड और अन्य सामान here का उल्लेख करने के अलावा, एक आसान तरीका है।

यदि आप पॉज़िक्स सिस्टम पर हैं, तो इसे posix.fork() (luaposix से) के पुराने तरीके से करने का प्रयास करें। आप जानते हैं, कार्य को बैचों में विभाजित करें, कोर की संख्या के रूप में प्रक्रियाओं की संख्या को फोर्क करें, संख्याओं को क्रंच करें, परिणाम एकत्र करें।

इसके अलावा, सुनिश्चित करें कि आप अधिकतम गति प्राप्त करने के लिए LuaJIT 2 का उपयोग कर रहे हैं।

0

यह बहुत आसान है कि बहुत सारे लुआ दुभाषिया बनाएं और उन सभी के अंदर लुआ कार्यक्रम चलाएं।

लुआ मल्टीथ्रेडिंग एक साझा कुछ भी मॉडल नहीं है। यदि आपको डेटा का आदान-प्रदान करने की आवश्यकता है तो आपको डेटा को तारों में क्रमबद्ध करना होगा और उन्हें एक दुभाषिया से दूसरे में सी एक्सटेंशन या सॉकेट या किसी भी प्रकार के आईपीसी के साथ पास करना होगा।

0

आईपीसी-जैसे परिवहन तंत्र के माध्यम से डेटा को सीरियलाइज करना थ्रेड में डेटा साझा करने का एकमात्र तरीका नहीं है।

यदि आप किसी ऑब्जेक्ट-उन्मुख भाषा जैसे सी ++ में प्रोग्रामिंग कर रहे हैं तो ऑब्जेक्ट पॉइंटर्स के माध्यम से थ्रेड में साझा ऑब्जेक्ट्स तक पहुंचने के लिए कई धागे के लिए यह संभव है, ऐसा करने के लिए अभी तक सुरक्षित नहीं है, जब तक कि आप किसी प्रकार की गारंटी न दें कोई भी दो धागे एक ही डेटा को पढ़ने और लिखने का प्रयास नहीं करेंगे।

आप यह कैसे कर सकते हैं इसके लिए कई विकल्प हैं, लॉक-फ्री और प्रतीक्षा-मुक्त तंत्र तेजी से लोकप्रिय होते जा रहे हैं।

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

  • कोई संबंधित समस्या नहीं^_^