2010-03-11 12 views
60

में मल्टीथ्रेडिंग मैं अपनी शेल स्क्रिप्ट में मल्टीथ्रेडिंग सुविधा पेश करना चाहता हूं।बैश

मेरे पास एक स्क्रिप्ट है जो विभिन्न तर्कों के साथ read_cfg() फ़ंक्शन को कॉल करती है। इनमें से प्रत्येक फ़ंक्शन कॉल स्वतंत्र हैं।

समान रूप से इन फ़ंक्शन कॉल (स्क्रिप्ट नहीं) को तुरंत चालू करना संभव होगा। कृपया मुझे बताएं कि हम इसे कैसे प्राप्त कर सकते हैं ..?

+0

यह multithreading नहीं है - यह बहु है। प्रत्येक उदाहरण एक अलग प्रक्रिया में चलाया जाता है, मूल से 'फोर्क() 'के साथ कॉपी किया जाता है। इन प्रक्रियाओं - धागे के विपरीत - अपनी फ़ाइल डिस्क्रिप्टर टेबल हैं, और उनकी याददाश्त कॉपी-ऑन-राइट है (इसलिए जब वे एक चर के मान को बदलते हैं, तो मूल प्रक्रिया इसे नहीं देखती)। –

उत्तर

127

ज़रूर, बस आदेश के बाद & जोड़ें:

read_cfg cfgA & 
read_cfg cfgB & 
read_cfg cfgC & 
wait 

उन सभी नौकरियों तो एक साथ पृष्ठभूमि में चला जाएगा। वैकल्पिक wait कमांड तब सभी नौकरियों को समाप्त करने की प्रतीक्षा करेगा।

प्रत्येक आदेश एक अलग प्रक्रिया में चलाएगा, इसलिए यह तकनीकी रूप से "बहुप्रचार" नहीं है, लेकिन मेरा मानना ​​है कि यह आपकी समस्या हल करता है।

+6

आपको प्रक्रिया और धागे के बीच का अंतर पढ़ना चाहिए। जो आप प्रस्तावित करते हैं वह मल्टीथ्रेडिंग नहीं है - इसमें प्रत्येक कमांड के लिए अलग प्रक्रियाएं शामिल होती हैं। – TomTom

+24

@ टॉमटॉम: मुझे निश्चित रूप से प्रक्रियाओं और धागे के बीच का अंतर पता है। यदि आप ओपी के शब्दों की पसंद के माध्यम से देखते हैं, तो मेरा मानना ​​है कि वह केवल यह पूछ रहा है कि समानांतर में आदेशों को चलाने के लिए संभव है (जो संभव है)। मैंने स्पष्टीकरण के लिए इसके बारे में एक नोट जोड़ा। – Martin

19

बैश नौकरी नियंत्रण में कई प्रक्रियाएं शामिल हैं, एकाधिक धागे नहीं।

आप & प्रत्यय के साथ पृष्ठभूमि में एक आदेश निष्पादित कर सकते हैं।

आप wait कमांड के साथ पृष्ठभूमि कमांड को पूरा करने के लिए प्रतीक्षा कर सकते हैं।

आप उन्हें | से अलग करके समांतर में एकाधिक कमांड निष्पादित कर सकते हैं। यह एक सिंक्रनाइज़ेशन तंत्र भी प्रदान करता है, क्योंकि | के बाईं ओर एक कमांड का stdout दाएं कमांड के stdin से जुड़ा हुआ है।

23

आप समानांतर में अपनी स्क्रिप्ट की कई प्रतियां चला सकते हैं, अलग-अलग इनपुट डेटा के लिए प्रत्येक प्रति, उदा। 4 कोर पर सभी * .cfg फ़ाइलों को प्रोसेस करने:

ls *.cfg | xargs -P 4 -n 1 read_cfg.sh 

read_cfg.sh स्क्रिप्ट सिर्फ एक पैरामीटर लेता है (जैसा कि -n द्वारा लागू)

+2

सिर्फ एक नोट है कि आपको 'read_cfg.sh' या 'xargs' के लिए पूरा पथ निर्दिष्ट करना होगा, यह कहेंगे कि यह फ़ाइल नहीं ढूंढ सकता है। – Jeshurun

+0

'printf'% s \ 0 '* .cfg का उपयोग करने के लिए बेहतर है। xargs -0 ... '- इस तरह यह रिक्त स्थान, अप्रकाशित पात्रों आदि के साथ फ़ाइल नामों के साथ काम करता है। यह भी देखें [आपको ls (1) के आउटपुट को पार्स क्यों नहीं करना चाहिए] (http://mywiki.wooledge.org/ParsingLs)। –