मुझे इस लेख को पूरी तरह से निराशाजनक, मेरी राय में, PHP भाषा में मल्टीटास्किंग के साथ स्थिति लिखने के लिए नेतृत्व किया गया था।
अधिकांश प्रोग्रामर का कहना है कि PHP में कोई मल्टीटास्किंग नहीं है, इसलिए आपको प्रयास करने की ज़रूरत नहीं है, और कम-से-कम लोग अभी भी बहुत सारी स्क्रिप्ट चलाकर किसी भी तरह से पलटने की कोशिश करते हैं, या सबसे अच्छी स्थिति में, उदाहरण के लिए, डाउनलोड को समानांतर करने के लिए कुछ बहुत ही निजी समाधानों के साथ आते हैं।
यह लेख लगभग किसी भी प्रोग्रामिंग भाषा में मल्टीटास्किंग को लागू करने के तरीके के विचार को प्रदर्शित करने के लिए है।
तो बोलने के लिए, अवधारणा का प्रमाण।
जैसा कि वे कहते हैं, नया सब कुछ अच्छी तरह से पुराना है।
यद्यपि इस पद्धति का पूर्ण कार्यान्वयन है, मैं तुरंत चेतावनी दूंगा कि मैं तैयार समाधान नहीं दूंगा।
अधिकांश प्रोग्रामिंग भाषाओं में और विशेष रूप से PHP में मल्टीटास्किंग के आयोजन में वास्तव में क्या समस्या है?
एक साधारण उदाहरण पर विचार करें:
एक फ़ंक्शन लिखना आवश्यक है जो एक निश्चित अवधि के लिए प्रतीक्षा करता है।
function wait($delta) { $time=microtime(1)+$delta; while($time <= microtime(1)) {} }
सब कुछ एक रेक की तरह है, लेकिन एक समस्या उत्पन्न होती है - यह फ़ंक्शन नियंत्रण वापस नहीं करेगा जब तक कि निर्दिष्ट समय बीत चुका है।
अब, यदि हम चक्र से बाहर निकल सकते हैं, और फिर वहां फिर से लौटेंगे ...
सिद्धांत रूप में, इस फ़ंक्शन को एक कार्य के रूप में माना जा सकता है, केवल परेशानी यह है कि 2 ऐसे कार्यों को समानांतर में लॉन्च नहीं किया जा सकता है।
और प्रतीक्षा फ़ंक्शन और प्रतीक्षा कार्य के बीच अंतर क्या है? अनिवार्य रूप से कुछ भी नहीं।
किसी भी कार्य को एक फ़ंक्शन के रूप में लिखा जा सकता है, लेकिन तब एक फ़ंक्शन क्या कार्य करता है?
यह सही है! कार्य एक घटना प्रसंस्करण एल्गोरिथ्म है। यह वही है जो वास्तव में फ़ंक्शन को कार्य करता है।
और अधिकांश समय कार्य क्या करता है? फिर से अनुमान लगाया - किसी प्रकार के आयोजन की प्रतीक्षा कर रहा है। तो आपको यह पता लगाने की आवश्यकता है कि इंतजार किए बिना कैसे प्रतीक्षा करें।
क्या समस्या है? आइए इसे थोड़ा अलग तरीके से देखें।
वास्तव में, किसी भी कार्य को एक परिमित राज्य मशीन के रूप में दर्शाया जा सकता है, और इस उदाहरण में इस मशीन के केवल 3 राज्य हैं।
यह वही है जिसकी हमें आवश्यकता होगी।
function wait($delta) { switch($state) { case 'init': $time=microtime(1)+$delta; $state='wait'; break; case 'wait': if($time <= microtime(1)) { $state='exit'; } break; case 'exit':
इस विवरण के साथ, यह स्पष्ट है कि फ़ंक्शन तुरंत अपने नियंत्रण में आ जाएगा और किसी भी चीज़ का इंतजार नहीं करेगा।
मान लीजिए कि किसी फ़ंक्शन का पहला कॉल हमेशा $ $ = 'init' होता है;
यदि आप नियमित रूप से इस फ़ंक्शन को कॉल करते हैं, तो यह उसके सभी राज्यों, और बहुत कुछ के माध्यम से जाएगा
वह किसी भी समय नहीं थी। वह व्यावहारिक रूप से किसी भी समय नहीं लेती है, क्योंकि प्रत्येक कॉल के साथ वह बहुत कम संख्या में ऑपरेशन करती है।
यह $ राज्य चर को कैसे शुरू करें, फ़ंक्शन कॉल के बीच स्थानीय चर कैसे बचाएं, इस कार्य को कैसे करें और इसके निष्पादन को कैसे रोकें, इसकी समस्याओं को हल करने के लिए बनी हुई है?
चलो कॉल के साथ शुरू करते हैं।
चलो एक सरणी प्राप्त करते हैं जिसमें निष्पादन के लिए कार्य शामिल होंगे
$tasks=array();
तब इस सरणी में आवश्यक डेटा जोड़ने के लिए कार्य का निर्माण कम हो जाएगा।
सादगी के लिए, मान लीजिए कि कार्य केवल 1 पैरामीटर लेता है। वास्तव में, यह पर्याप्त है, हालांकि बहुत सुविधाजनक नहीं है।
function startTask($name,$param) { global $tasks;
मैं ध्यान देना चाहता हूं कि $ कार्यों को संशोधित करके [$ id] ['नाम'] और $ कार्यों [$ id] [] परम ’] को एक कार्य कर सकते हैं
वर्तमान लूप के बजाय किसी अन्य फ़ंक्शन को निष्पादित करने के लिए अगले लूप में बल। यानी फ़ंक्शन अलग होगा, लेकिन कार्य समान रहेगा।
इस तंत्र के साथ काम करने के लिए अधिक सुविधाजनक कार्यों की दिशा में आगे विकास संभव है।
उदाहरण के लिए, हस्तांतरित मापदंडों की संख्या पर कोई प्रतिबंध नहीं है, किसी अन्य कार्य को वर्तमान कार्य के उपशीर्षक के रूप में कहते हैं, आदि, लेकिन मैं इच्छुक पाठकों के लिए इन तंत्रों के कार्यान्वयन को छोड़ दूंगा।
यह सब सिर्फ तेजी से काम करता है।
और मैं यह नोट करना चाहता हूं कि उपरोक्त सभी एक तैयार समाधान नहीं है, बल्कि दृष्टिकोण का एक शुद्ध प्रदर्शन है।
लेकिन इसके आवेदन से जबरदस्त अवसर खुलते हैं। उदाहरण के लिए, कार्यों के रूप में डिज़ाइन किए गए multi_curl या सॉकेट्स का उपयोग आपको कई समानांतर डाउनलोड कार्य चलाने की अनुमति देता है, जबकि प्रत्येक के पास डेटा के साथ काम करने के लिए अपने स्वयं के परिणाम संचालकों और अपने तर्क हो सकते हैं, इसके अलावा, एक ही समय में अन्य कार्य अन्य कार्य कर सकते हैं।
आप PHP में डेमन लिख सकते हैं और यहां तक कि कुछ हार्डवेयर ड्राइवर भी।
उदाहरण के लिए, परियोजनाओं में से एक में, डेमॉन ने COM पोर्ट पर कई डिवाइस दिए, जिनमें से प्रत्येक का अपना डेटा एक्सचेंज प्रोटोकॉल था, बाहरी क्लाइंट के लिए एक टीसीपी सर्वर के रूप में कार्य किया, केंद्रीय सर्वर के लिए एक क्लाइंट के रूप में काम किया और सभी भुगतान टर्मिनल प्रबंधन तर्क को लागू किया, और उसी समय केवल 3% पर कब्जा कर लिया। प्रोसेसर संसाधन।
और यह सब सिर्फ एक चल रही स्क्रिप्ट द्वारा किया गया था।
मल्टीटास्किंग के साथ, यह सब लागू करना बहुत आसान हो जाता है।
ऐसे समय होते हैं जब कुछ ऑपरेशन में बहुत समय लगता है (अन्य ऑपरेशन की गति के मानकों द्वारा)।
फिर उन्हें बाहरी प्रक्रियाओं के रूप में चलाने की सलाह दी जाती है, लेकिन एक ही समय में, उनके लॉन्च और नियंत्रण को उनके कार्यों के रूप में वैसे भी निष्पादित करें।
एक डेमो एक समान उदाहरण का वास्तविक कार्य डेटा दिखा रहा है,
यहां स्थित है
http://tester.in/rt/task_test.php