यह पैटर्न बहुत कुछ आता है लेकिन मुझे सीधा जवाब नहीं मिल रहा है।पाइथन के समय का व्यवहार। नींद (0) लिनक्स के तहत - क्या यह संदर्भ स्विच का कारण बनता है?
एक गैर महत्वपूर्ण, संयुक्त राष्ट्र के अनुकूल कार्यक्रम अन्य प्रौद्योगिकियों और प्लेटफार्मों का उपयोग
while(True):
# do some work
कर सकते हैं, अगर आप इस कार्यक्रम गर्म चलाने (जितना संभव हो उतना CPU चक्र का उपयोग), लेकिन विनम्र होना करने के लिए अनुमति देना चाहते हैं
while(True):
#do some work
time.sleep(0)
के बारे में मैं बाद दृष्टिकोण करना होगा कि क्या परस्पर विरोधी जानकारी पढ़ा है कि मैं क्या अजगर पर आशा करना चाहते हैं, पर चल रहा है: - अन्य कार्यक्रमों जो गर्म चल रहे हैं प्रभावी ढंग से मुझे धीमा करने के लिए आप अक्सर लिखते हैं अनुमति देते हैं, एक लिनक्स बॉक्स। क्या यह संदर्भ स्विच का कारण बनता है, जिसके परिणामस्वरूप ऊपर वर्णित व्यवहार होता है?
संपादित करें: इसके लायक होने के लिए, हमने ऐप्पल ओएसएक्स में थोड़ा प्रयोग करने की कोशिश की (लिनक्स बॉक्स आसान नहीं था)। इस बॉक्स को 4 कोर प्लस हाइपरथ्रेडिंग हम साथ 8 प्रोग्राम काता है तो बस एक
while(True):
i += 1
जैसी उम्मीद थी, गतिविधि मॉनिटर लेने वाली 95% से अधिक सीपीयू (जाहिरा तौर पर 4 कोर और हाइपरथ्रेडिंग आपको मिल के साथ के रूप में 8 प्रक्रियाओं में से प्रत्येक से पता चलता 800% कुल)। फिर हम नौवें ऐसे कार्यक्रम को बढ़ाते हैं। अब सभी 9 85% के आसपास चलाते हैं। अब नौवें पुरुष को मारने और
while(True):
i += 1
time.sleep(0)
मुझे उम्मीद थी कि इस प्रक्रिया को 0% के करीब का प्रयोग करेंगे और अन्य 8 95% चल पाएंगे के साथ एक कार्यक्रम को स्पिन। लेकिन इसके बजाय, सभी नौ 85% के आसपास दौड़ते हैं। तो ऐप्पल ओएसएक्स पर, नींद (0) का कोई असर नहीं पड़ता है।
यह सहायक है। मैं यह सुनिश्चित करना चाहता हूं कि मैं आपके निष्कर्ष को समझूं। Time.sleep (0) एक संदर्भ स्विच कर रहा है - है ना? लेकिन मुझे लगता है कि शायद मेरी धारणा गलत थी कि इससे मेरा कार्यक्रम अन्य प्रक्रियाओं के लिए अधिक अनुकूल हो जाएगा? –
@ मैथ्यू दो चीजें हैं - एक संदर्भ स्विच है (एक अन्य प्रक्रिया में स्विच करने के रूप में स्विचिंग कार्य) और कर्नेल मोड में स्विचिंग - बस कर्नेल मोड में स्विच करने का मतलब यह नहीं है कि आप एक और प्रक्रिया सीपीयू टाइम भी देंगे। शायद देरी जोड़ना (अगर कुछ और चल रहा है) होगा। यह (नींद (0)) निश्चित रूप से आपको कर्नेल मोड में ले जाएगा; यह प्रश्न में कर्नेल पर निर्भर करता है कि क्या कोई देरी नहीं मांगती है, फिर से आपके प्रोग्राम को फिर से जगाता है, या यदि यह अन्य प्रक्रियाओं की तलाश करता है जो फाइल डिस्क्रिप्टर पर समय सीमा समाप्त होने के साथ सीपीयू समय की प्रतीक्षा कर रहे हैं। –
वास्तव में चयन मैं stdin पर नहीं है। चुनने के लिए पहला तर्क() तीन सेटों में दायरस्क्रिप्टर्स की संख्या है ... इस मामले में 0. यह नैनोसेकंद आधारित शताब्दियों को लागू करने के लिए एक चाल है। –