2008-09-18 19 views

उत्तर

268

यह धागा को अवरुद्ध करता है। यदि आप पाइथन स्रोत में मॉड्यूल/timemodule.c में देखते हैं, तो आप देखेंगे कि floatsleep() पर कॉल में, नींद ऑपरेशन का वास्तविक हिस्सा एक pie_BEGIN_ALLOW_THREADS और Py_END_ALLOW_THREADS ब्लॉक में लपेटा गया है, जिससे अन्य थ्रेड निष्पादित होने की अनुमति देते हैं। वर्तमान एक सोता है। तुम भी एक साधारण अजगर कार्यक्रम के साथ इस परीक्षण कर सकते हैं:

import time 
from threading import Thread 

class worker(Thread): 
    def run(self): 
     for x in xrange(0,11): 
      print x 
      time.sleep(1) 

class waiter(Thread): 
    def run(self): 
     for x in xrange(100,103): 
      print x 
      time.sleep(5) 

def run(): 
    worker().start() 
    waiter().start() 

कौन सा प्रिंट होगा:

>>> thread_test.run() 
0 
100 
>>> 1 
2 
3 
4 
5 
101 
6 
7 
8 
9 
10 
102 
+0

एक "थ्रेड" को कैसे दिखाया गया है अवरुद्ध किया गया है। और क्यों न केवल 5 और 103 मुद्रित होते हैं, जबकि अन्य सभी नंबर मुद्रित होते हैं। अगर कोई समझा सकता है तो मेरे लिए वास्तव में सहायक होगा। – akki

+0

@akki: कृपया पुराने प्रश्न की टिप्पणियों का उपयोग करने के बजाय एक नया प्रश्न पूछें। इसके अलावा, 5 मुद्रित हो जाता है (यह 101 से ठीक पहले है)। –

+2

इस उत्तर के अर्थ से पूछने के लिए एक नया प्रश्न खोलें? यह मेरे लिए काफी अजीब लगता है। और मेरा मतलब 11 (5 नहीं), क्षमा करें अब मेरी टिप्पणी को सही नहीं कर सकता। मुझे वास्तव में कुछ मदद की ज़रूरत है कि यह उत्तर किस बिंदु को बनाने का प्रयास कर रहा है। – akki

39

यह उस मामले को छोड़कर केवल थ्रेड सो जाएगा जहां आपके एप्लिकेशन में केवल एक ही धागा है, इस मामले में यह थ्रेड और प्रभावी रूप से प्रक्रिया को भी सोएगा।

नींद पर अजगर दस्तावेज यह निर्दिष्ट नहीं करता है, इसलिए मैं निश्चित रूप से भ्रम को समझ सकता हूं!

http://docs.python.org/2/library/time.html

+2

@MichaelMrozek: ['नींद (3) 'कहता है: *" नींद() कॉलिंग थ्रेड को सेकंड सेकेंड तक समाप्त होने तक नींद आती है या सिग्नल आता है जिसे अनदेखा नहीं किया जाता है। "*] (Http: // man7। संगठन/लिनक्स/मैन-पेज/मैन 3/नींद 3.html) और [पाइथन दस्तावेज बग है] (http://bugs.python.org/issue23251)। – jfs

8

धागा को अवरुद्ध कर देगा, लेकिन यह प्रक्रिया अभी भी जीवित है।

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

1

केवल धागा जब तक आपके प्रक्रिया किसी एकल थ्रेड है।

1

प्रक्रिया स्वयं ही चलाने योग्य नहीं है। निष्पादन के संबंध में, प्रक्रिया धागे के लिए सिर्फ एक कंटेनर है। मतलब आप प्रक्रिया को रोक नहीं सकते हैं। यह प्रक्रिया पर लागू नहीं है।

+0

है ना? यह विंडोज या कुछ पर सच हो सकता है, लेकिन निश्चित रूप से सार्वभौमिक नहीं है।यूनिक्स परंपरागत रूप से धागे नहीं थे, और इसलिए एक पायथन प्रोग्राम एक प्रक्रिया चलाता है (एक धागे के साथ, कुछ अमूर्त अर्थ में) जो 'नींद' आदेश रोक देगा। – tripleee

+0

आपको निराश करने के लिए दुख, लेकिन विंडोज़ और सभी * निक्स सिस्टम पर मुख्य चलने वाली इकाई एक धागा है। आप धागे के बिना प्रक्रिया नहीं चला सकते हैं। यदि आप अंतिम धागे से बाहर निकलते हैं, तो प्रक्रिया समाप्त हो जाती है। –