time.sleep - सोता है धागा या प्रक्रिया?


जवाबों:


353

यह धागे को ब्लॉक करता है। यदि आप Python स्रोत में मॉड्यूल / timemodule.c में देखते हैं, तो आप देखेंगे कि कॉल करने के लिए floatsleep(), स्लीप ऑपरेशन का मूल भाग Py_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

3
एक "सूत्र" का चित्रण कैसे अवरुद्ध हो गया है। और केवल 5 और 103 ही क्यों न प्रिंट किए जाएं, जबकि अन्य सभी नंबर प्रिंट हो जाएं। अगर कोई समझा सकता है तो वास्तव में मेरे लिए उपयोगी होगा।
अक्की

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

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

पहला उत्तर: रेंज फंक्शन xrange (k, m) k को m-1 इनक्लूसिव में शामिल संख्या देता है, इसलिए एक्सप्रेशन लिस्ट (xrange (100, 103)) रिटर्न [100, 101, 102]। इसका मतलब है कि लंबाई (सूची (xrange, k))) == m - k।
जेफ युनकर

3
akki, अधिक विशेष रूप से, time.sleep () time.sleep () नामक थ्रेड को ब्लॉक करता है, लेकिन यह अन्य थ्रेड्स को चलाने के लिए पायथन जीआईएल जारी करता है (इसलिए यह प्रक्रिया को ब्लॉक नहीं करता है)। निक के उदाहरण ने वास्तव में धागे के अवरुद्ध होने को नहीं दिखाया, यह अधिक दिखाया गया कि जीआईएल जारी किया गया है (इस प्रकार यह दिखा रहा है कि प्रक्रिया अवरुद्ध नहीं है)। मुझे लगता है कि अगर उनके पास वेटर () थ्रेड में time.sleep (5) के बाद प्रिंट स्टेटमेंट की तरह अधिक सामान था, तो यह दिखाएगा कि प्रिंट time.sleep (5) समाप्त होने के बाद (यानी ब्लॉकिंग) तक नहीं हुआ था
गनित

52

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

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

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




13

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

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


3

जब तक आपकी प्रक्रिया में एक ही धागा न हो तब तक केवल धागा।


2

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


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

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

इस सवाल का जवाब नहीं है। विशेष रूप से, यह सवाल पायथन के बारे में है। पायथन में ग्लोबल इंटरप्रेटर लॉक (GIL) है। यदि कोई धागा जीआईएल को पकड़कर सो जाता है, तो यह प्रक्रिया में सभी पायथन धागे को अवरुद्ध कर देगा, क्योंकि वे सभी एक ही लॉक साझा करते हैं।
Cort Ammon

1

यदि यह मुख्य कोड से निष्पादित किया जाता है तो यह उसी थ्रेड में निष्पादित होने पर थ्रेड को ब्लॉक करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.