Python Academy · पाठ

डेटा सुरक्षित रूप से साझा करना

कतारों और लॉक का उपयोग करें

पाठ 4, कुल 4 में से13 चरण

डेटा सुरक्षित रूप से साझा करना, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

रेस कंडीशन की समस्या

जब कई थ्रेड एक ही डेटा में बदलाव करते हैं, तो उनके काम एक-दूसरे के बीच मिल सकते हैं और परिणाम खराब हो सकता है। इसे रेस कंडीशन कहते हैं। डेटा को सुरक्षित रूप से साझा करने के लिए हमें समकालिकीकरण उपकरणों की आवश्यकता होती है।

import threading

counter = 0

def bump():
    global counter
    for _ in range(100000):
        counter += 1

ts = [threading.Thread(target=bump) for _ in range(2)]
for t in ts: t.start()
for t in ts: t.join()
print('counter (may be < 200000):', counter)

लॉक से समाधान

threading.Lock यह सुनिश्चित करता है कि एक समय में केवल एक थ्रेड महत्वपूर्ण खंड में प्रवेश करे। साझा अपडेट के चारों ओर with खंड का उपयोग करके इसे प्राप्त कीजिए।

import threading

counter = 0
lock = threading.Lock()

def bump():
    global counter
    for _ in range(100000):
        with lock:
            counter += 1

ts = [threading.Thread(target=bump) for _ in range(2)]
for t in ts: t.start()
for t in ts: t.join()
print('counter:', counter)

acquire और release

लॉक का उपयोग acquire() और release() के साथ मैन्युअल रूप से किया जा सकता है, लेकिन with का रूप अधिक सुरक्षित है, क्योंकि त्रुटि होने पर भी यह लॉक को छोड़ देता है।

import threading

lock = threading.Lock()
lock.acquire()
try:
    print('inside critical section')
finally:
    lock.release()
print('released')

थ्रेड-सुरक्षित क्यू

queue.Queue class पहले से ही थ्रेड-सुरक्षित है। थ्रेड स्पष्ट लॉक के बिना put और get कर सकते हैं, इसलिए डेटा भेजने के लिए इसे प्राथमिकता दी जाती है।

import queue, threading

q = queue.Queue()

def producer():
    for i in range(3):
        q.put(i)

t = threading.Thread(target=producer)
t.start()
t.join()
while not q.empty():
    print('got', q.get())

producer और consumer

प्रचलित तरीका यह है: उत्पादक काम को क्यू में put करते हैं, और उपभोक्ता उसे get करके संसाधित करते हैं। क्यू लॉक से जुड़ा सारा काम संभालता है।

import queue, threading

q = queue.Queue()
results = []

def consumer():
    while True:
        item = q.get()
        if item is None:
            break
        results.append(item * 10)
        q.task_done()

t = threading.Thread(target=consumer)
t.start()
for i in range(3):
    q.put(i)
q.put(None)
t.join()
print(results)

join और task_done

q.join() तब तक रुकता है जब तक put किए गए हर आइटम के लिए संबंधित task_done() कॉल न हो जाए। इससे मुख्य थ्रेड सभी काम पूरा होने तक प्रतीक्षा कर सकता है।

import queue, threading

q = queue.Queue()

def worker():
    while True:
        item = q.get()
        q.task_done()

threading.Thread(target=worker, daemon=True).start()
for i in range(5):
    q.put(i)
q.join()
print('all items processed')

पुनःप्रवेशिता के लिए RLock

साधारण Lock तब डेडलॉक हो जाता है जब वही थ्रेड उसे दूसरी बार प्राप्त करने का प्रयास करता है। threading.RLock (पुनःप्रवेशी लॉक) ऐसा करने देता है और प्राप्तियों की संख्या गिनता है।

import threading

rlock = threading.RLock()

def outer():
    with rlock:
        inner()

def inner():
    with rlock:
        print('re-entered safely')

outer()

संकेत देने के लिए Event

threading.Event एक थ्रेड को दूसरे थ्रेड्स को संकेत देने देता है। थ्रेड wait() को कॉल करते रहते हैं, जब तक कोई दूसरा थ्रेड set() को कॉल न कर दे।

import threading

start = threading.Event()

def worker():
    start.wait()
    print('go!')

t = threading.Thread(target=worker)
t.start()
print('setting event')
start.set()
t.join()

प्रक्रियाओं के बीच साझा करना

प्रक्रियाओं के बीच डेटा साझा करने के लिए इसके बजाय multiprocessing.Queue का उपयोग कीजिए। यह अलग-अलग मेमोरी क्षेत्रों के बीच ऑब्जेक्ट्स को क्रमबद्ध करके भेजता है।

import multiprocessing as mp

def producer(q):
    for i in range(3):
        q.put(i * i)

if __name__ == '__main__':
    q = mp.Queue()
    p = mp.Process(target=producer, args=(q,))
    p.start()
    p.join()
    while not q.empty():
        print('received', q.get())

डेडलॉक से बचना

डेडलॉक तब होता है जब थ्रेड हमेशा के लिए एक-दूसरे के लॉक की प्रतीक्षा करते रहते हैं। इससे बचने के लिए हर जगह कई लॉक हमेशा एक ही क्रम में प्राप्त कीजिए।

import threading

lock_a = threading.Lock()
lock_b = threading.Lock()

def safe():
    with lock_a:
        with lock_b:
            print('acquired in consistent order')

safe()

लॉक के बजाय क्यू को प्राथमिकता दें

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

import queue

q = queue.Queue()
for word in ['safe', 'simple', 'clear']:
    q.put(word)
while not q.empty():
    print(q.get())

त्वरित जाँच

डेटा को सुरक्षित रूप से साझा करने के बारे में अपनी समझ का परीक्षण कीजिए।

पुनरावलोकन

आपने डेटा को सुरक्षित रूप से साझा करना सीखा:

  • बिना सुरक्षा के साझा स्थिति को रेस कंडीशन खराब कर देती हैं।
  • Lock और RLock महत्वपूर्ण खंडों की सुरक्षा करते हैं।
  • queue.Queue थ्रेड-सुरक्षित है; प्रक्रियाओं के बीच multiprocessing.Queue का उपयोग कीजिए।
  • Event थ्रेड्स के बीच संकेत देता है; लॉक का एकसमान क्रम डेडलॉक से बचाता है।

अगला पाठ्यक्रम: subprocess के साथ बाहरी प्रोग्राम चलाना।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
76
पाठ
320

अक्सर पूछे जाने वाले प्रश्न

क्या “डेटा सुरक्षित रूप से साझा करना” पाठ निःशुल्क है?

हाँ—“डेटा सुरक्षित रूप से साझा करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“डेटा सुरक्षित रूप से साझा करना” में मैं क्या सीखूँगा?

कतारों और लॉक का उपयोग करें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“डेटा सुरक्षित रूप से साझा करना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. थ्रेड और GIL
  2. ThreadPoolExecutor
  3. multiprocessing की मूल बातें
  4. डेटा सुरक्षित रूप से साझा करना
← Python Academy पर वापस जाएँ