2013-06-04 5 views
5

कुछ प्रयासों के बाद, मैंने एक PHP मल्टीथ्रेडेड सर्वर स्थापित करने में कामयाब रहा जो एकाधिक वेबसाकेट से इनपुट प्राप्त करता है और इसे एक एकल टीसीपी सॉकेट पर भेजता है। मैंने इसे pthreads के साथ पूरा किया और एक सरणी के रूप में Stackable ऑब्जेक्ट का उपयोग करने में कामयाब रहे।थ्रेड, श्रमिक, म्यूटेक्स, स्टैकेबल के बीच अंतर?

अगले कदम अब वास्तव में समझने के लिए मैं क्या कर रहा है और सबसे निश्चित रूप से मैं क्या बेहतर कर सकते हैं। मैंने एसओ पर कहीं कहीं पढ़ा है कि मल्टीथ्रेडिंग ऐसा कुछ नहीं है जिसे आप बस करते हैं। इस कारण से मैं कोडिंग पर जाने से पहले गहराई से खोदना चाहता हूं। मुझे इन सवालों पर लाता है:

A Worker Thread has a persistent state (pthreads.org) का क्या अर्थ है। क्या एक कार्यकर्ता गुंजाइश से बाहर चल रहा है? Stackables के साथ उनके संबंध क्या है?

पीएचपी मैनुअल का कहना है कि कार्यकर्ता धागे धागे से अधिक इस्तेमाल किया जाना चाहिए, क्यों?

मुझे आशा है कि मेरे सवाल का व्यापक करने के लिए नहीं है।

उत्तर

13

एक कार्यकर्ता धागा एक लगातार राज्य है: जब आप एक कार्यकर्ता धागा शुरू, कार्यकर्ता निष्पादन के लिए उपलब्ध है जब तक चर दायरे से बाहर चला जाता है या कार्यकर्ता बंद है।

एक स्क्रिप्ट का उदाहरण लें जो कई स्रोतों से कई पृष्ठों को डाउनलोड करता है: एक छोटे पैमाने पर, आप इससे दूर हो सकते हैं, और यह एकाधिक धागे रखने के लिए सबसे अच्छा डिज़ाइन हो सकता है, प्रत्येक थ्रेड एक अनुरोध से निपटने और सामग्री को संसाधित करना हालांकि, आम तौर पर, आपको एक अनुरोध करने के लिए धागे को शुरू करने के लिए एक बड़ा अपशिष्ट माना जाना चाहिए, या कुछ भी सरल निष्पादित करना चाहिए, इसके बजाय आप अपने हार्डवेयर और पर्यावरण के प्रबंधन के रूप में कई श्रमिकों को शुरू कर सकते हैं, और सामग्री के अनुरोध और प्रसंस्करण को कार्यान्वित कर सकते हैं एक स्थिर के रूप में। श्रमिकों का उपयोग करते समय, प्रत्येक अनुरोध से आपको थ्रेडिंग संदर्भ की शुरुआत नहीं होती है। इस संदर्भ में दृढ़ता इस तथ्य को संदर्भित करती है कि प्रत्येक स्टैकबेल इस-> कार्यकर्ता को पढ़ सकता है, और सभी/किसी भी वैश्विक (कक्षा स्तर स्थिर चर सहित) स्कॉप्स तक पहुंच सकता है, इसलिए निष्पादन के दौरान स्टैकेबल के परिप्रेक्ष्य से कार्यकर्ता बनी रहती है, हकीकत में स्टैकबेल बस एक संदर्भ साझा कर रहे हैं।

Mutex और Cond कट्टर POSIX थ्रेडिंग नशेड़ी के लिए देखते हैं, और pthreads खुद के विकास के दौरान मेरी प्रयोजनों के लिए। सामान्य उपयोगकर्ताओं को वास्तव में इस कार्यक्षमता का उपयोग नहीं करना चाहिए, हालांकि यह समकक्ष पॉज़िक्स कार्यों के रूप में भी दस्तावेज किया गया है, और अधिकांश मूल दस्तावेज अभी भी लागू होते हैं (शीर्ष पर समझदार की परत के साथ)। म्यूटेक्स और कंड परिचित कार्यक्षमता के आसपास पतली रैपर दोनों हैं, और वास्तव में जो ब्लॉग्स का लक्ष्य नहीं है।

मुझे लगता है कि आप सोच रहे हैं कि म्यूटक्स को वस्तुओं को सुरक्षित पढ़ने और लिखने के लिए आवश्यक है, तो ऐसा नहीं है, सुरक्षा को पठार में बनाया गया है।

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

तथ्य यह है कि यदि आप थ्रेडिंग को देख रहे हैं, तो आप एक समय में 2 से 3 चीजें करना चाहते हैं, संभावना है कि आप कुछ चीजें करने के तरीके पा सकते हैं। तो pthreads पैकेज के हिस्से के रूप में वर्कर/स्टेकेबल कार्यक्षमता प्रदान करना समझ में आता है, क्योंकि यह अलग-अलग संदर्भों में चीजों का एक गुच्छा निष्पादित करने के लिए बेहतर है, PHP में इस सामग्री को लिखना (यहां तक ​​कि pthreads की मदद से) मुश्किल होगा।

+0

धन्यवाद! यह एक बड़ी मदद है। जबकि मेरा कोड काम कर रहा था, मैं ट्रैक से बाहर था। मैं अभी भी सोच रहा हूं कि जब आप सादे थ्रेड ऑब्जेक्ट का उपयोग करेंगे। – marlonp33

+1

ठीक है, मैंने थ्रेड पर कुछ मो जानकारी के साथ उत्तर अपडेट किया है ... उम्मीद है कि आपके प्रश्न का पूरी तरह उत्तर दें। –

+0

मुझे यह समझने के लिए कई बार पढ़ना पड़ा कि आप क्या कह रहे हैं। लेकिन धन्यवाद! – Nerrve

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