Lua Academy · पाठ

resume और yield

resume/yield से कॉलर और कोरूटीन के बीच डेटा का आदान-प्रदान करें।

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

resume और yield, CoddyKit पर Lua Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Lua Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

कॉरूटीन में मान भेजना

पहले coroutine.resume को दिए गए तर्क कॉरूटीन के मुख्य फ़ंक्शन के पैरामीटर बन जाते हैं। बाद में किए गए resume कॉल के तर्क उस coroutine.yield() कॉल से लौटाए जाते हैं, जिसने कॉरूटीन को रोका था।

local co = coroutine.create(function(a, b)
  print("received:", a, b)        -- 10  20
  local c = coroutine.yield()     -- pauses
  print("after yield:", c)        -- 30
end)

coroutine.resume(co, 10, 20)  -- first call: passes a,b
coroutine.resume(co, 30)      -- subsequent: passed to yield

yield से मिलने वाले मान

coroutine.yield(val1, val2) को दिए गए मान उस coroutine.resume() कॉल के लौटाए गए मान बन जाते हैं, जो yield पर रुकी थी। इसलिए yield कॉल करने वाले को मान "लौटाती" है।

local co = coroutine.create(function()
  coroutine.yield(1, "hello")
  coroutine.yield(2, "world")
  return 3, "done"
end)

local ok, a, b = coroutine.resume(co)
print(ok, a, b)   -- true  1  hello

ok, a, b = coroutine.resume(co)
print(ok, a, b)   -- true  2  world

ok, a, b = coroutine.resume(co)
print(ok, a, b)   -- true  3  done

दोतरफ़ा संचार

कॉरूटीन वास्तविक दोतरफ़ा संचार संभव बनाती हैं: कॉल करने वाला resume के ज़रिए डेटा भेजता है, कॉरूटीन उसे संसाधित करके परिणाम वापस yield करती है। प्रत्येक resume/yield एक समकालिक आदान-प्रदान होता है।

local co = coroutine.create(function(x)
  while true do
    x = coroutine.yield(x * x)  -- yield x^2, get next x
  end
end)

coroutine.resume(co)  -- start (x=nil initially)
local ok, sq
ok, sq = coroutine.resume(co, 3); print(sq)  -- 9
ok, sq = coroutine.resume(co, 5); print(sq)  -- 25
ok, sq = coroutine.resume(co, 7); print(sq)  -- 49

उत्पादक-उपभोक्ता

कॉरूटीन का पारंपरिक पैटर्न: उत्पादक एक-एक करके आइटम yield करता है; उपभोक्ता को अगला आइटम चाहिए होने पर उत्पादक को फिर से चलाता है। दोनों में से कोई भी दूसरे से आगे नहीं चलता — यह पूर्ण समकालिकता है।

local function producer(items)
  return coroutine.create(function()
    for _, item in ipairs(items) do
      coroutine.yield(item)
    end
  end)
end

local pro = producer({"apple","banana","cherry"})

-- Consumer drives the loop
while true do
  local ok, item = coroutine.resume(pro)
  if not ok or item == nil then break end
  print("consumed:", item)
end

कॉरूटीन के साथ पाइपलाइन

कई कॉरूटीन को एक पाइपलाइन की तरह जोड़ें। प्रत्येक चरण पिछले चरण से पढ़ता है और अगले चरण को yield करता है। अंतिम चरण आखिरी चरण को फिर से चलाकर पाइपलाइन को संचालित करता है, जिससे यह प्रक्रिया पूरी शृंखला में पीछे की ओर फैलती है।

local function source(items)
  return coroutine.wrap(function()
    for _, v in ipairs(items) do coroutine.yield(v) end
  end)
end

local function filter(iter, pred)
  return coroutine.wrap(function()
    for v in iter do
      if pred(v) then coroutine.yield(v) end
    end
  end)
end

local function map(iter, fn)
  return coroutine.wrap(function()
    for v in iter do coroutine.yield(fn(v)) end
  end)
end

local pipeline = map(filter(source({1,2,3,4,5,6}),
  function(n) return n%2==0 end),
  function(n) return n*n end)

for v in pipeline do io.write(v.." ") end
print()  -- 4 16 36

अतुल्यकालिक अनुकरण के लिए कॉरूटीन

OS थ्रेड के बिना भी कॉरूटीन अतुल्यकालिक कार्रवाइयों का अनुकरण कर सकती हैं: "प्रतीक्षा" करते समय yield करें और जब "परिणाम" तैयार हो जाए, तब फिर से चलाएँ। एक शेड्यूलर परिणाम के साथ कॉरूटीन को फिर से चलाता है।

local scheduler = {}
local current = nil

local function await(key)
  coroutine.yield(key)  -- tell scheduler what we need
  return coroutine.yield()  -- wait for result
end

local co = coroutine.create(function()
  local data = await("fetch:users")
  print("Got users:", data)
end)

-- Start coroutine
local ok, want = coroutine.resume(co)
print("Coroutine wants:", want)  -- fetch:users
-- Simulate delivering the result:
coroutine.resume(co, {{name="Alice"},{name="Bob"}})

किसी फ़ंक्शन के अंदर yield

आप केवल सबसे बाहरी फ़ंक्शन से ही नहीं, बल्कि कॉरूटीन द्वारा बुलाए गए किसी भी फ़ंक्शन के अंदर से yield कर सकते हैं। yield सभी नेस्टेड कॉल के ज़रिए ऊपर जाती हुई resume तक पहुँचती है। इसे "निलंबित कॉल स्टैक" कहा जाता है।

local function yieldTwice(label)
  coroutine.yield(label .. ":1")
  coroutine.yield(label .. ":2")
end

local co = coroutine.create(function()
  yieldTwice("A")
  yieldTwice("B")
end)

for i = 1, 4 do
  local ok, v = coroutine.resume(co)
  print(v)
end
-- A:1, A:2, B:1, B:2

कॉरूटीन थ्रेड नहीं हैं

Lua की कॉरूटीन OS थ्रेड नहीं हैं। एक समय में केवल एक कॉरूटीन चलती है; इनमें प्रीएम्प्शन या समानांतरता नहीं होती। सभी कॉरूटीन एक ही OS थ्रेड साझा करती हैं। वास्तविक समानांतरता के लिए अलग-अलग OS थ्रेड में कई Lua स्टेट चाहिए।

-- This is NOT parallel - interleaved execution
local function task(name, n)
  for i = 1, n do
    print(name, i)
    coroutine.yield()
  end
end

local t1 = coroutine.create(function() task("A", 3) end)
local t2 = coroutine.create(function() task("B", 3) end)

-- Must explicitly schedule:
for _ = 1, 3 do
  coroutine.resume(t1)
  coroutine.resume(t2)
end
-- A1, B1, A2, B2, A3, B3 (interleaved, NOT parallel)

resume के बाद स्थिति

फिर से चलाना है या नहीं, यह तय करने के लिए कॉरूटीन की स्थिति जाँचें। जो कॉरूटीन अपना काम पूरा कर चुकी है (अपने मुख्य फ़ंक्शन से लौट चुकी है), वह "समाप्त" होती है — उसे फिर से चलाने पर false और एक त्रुटि मिलती है। लूप में फिर से चलाने से पहले हमेशा स्थिति जाँचें।

local co = coroutine.create(function()
  for i = 1, 3 do coroutine.yield(i) end
end)

while coroutine.status(co) ~= "dead" do
  local ok, val = coroutine.resume(co)
  if ok and val ~= nil then
    print("val:", val)
  end
end
-- val: 1, val: 2, val: 3

एक resume में कई yield

coroutine.resume की एक कॉल कॉरूटीन को अगले yield तक या उसके समाप्त होने तक चलाती है। आप एक ही resume में कॉरूटीन से कई बार yield नहीं करा सकते — प्रत्येक yield कॉरूटीन को रोककर अगले resume की प्रतीक्षा करती है।

local co = coroutine.create(function()
  local x = coroutine.yield("first")
  print("got:", x)
  local y = coroutine.yield("second")
  print("got:", y)
end)

local _, v1 = coroutine.resume(co)         -- starts, yields "first"
print("yielded:", v1)                       -- first
local _, v2 = coroutine.resume(co, "a")   -- passes "a", yields "second"
print("yielded:", v2)                       -- second
coroutine.resume(co, "b")                   -- passes "b", coroutine ends

त्वरित जाँच

coroutine.yield(v1, v2) को दिए गए मान किस रूप में बदल जाते हैं?

पुनरावलोकन: resume और yield

सारांश:

  • पहले resume के तर्क → कॉरूटीन के मुख्य फ़ंक्शन के पैरामीटर
  • बाद के resume के तर्क → पिछले yield() द्वारा लौटाए गए मान
  • yield के तर्क → उस resume() द्वारा लौटाए गए मान जिसने yield को सक्रिय किया
  • दोतरफ़ा संचार: प्रत्येक resume/yield एक आदान-प्रदान है
  • किसी भी नेस्टेड फ़ंक्शन से yield करना संभव है
  • कॉरूटीन: सहकारी, समानांतर नहीं
शुरुआत निःशुल्क

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

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

पाठ्यक्रम
40
पाठ
159

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

क्या “resume और yield” पाठ निःशुल्क है?

हाँ — Lua Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “resume और yield” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“resume और yield” में मैं क्या सीखूँगा?

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

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

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

“resume और yield” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. कोरूटीन बनाना
  2. resume और yield
  3. कोरूटीन की स्थिति
  4. उत्पादक-उपभोक्ता पैटर्न
← Lua Academy पर वापस जाएँ