Channels के साथ producer/consumer (सर्वेक्षण)
BlockingCollection का उपयोग करके Channels जैसी producer/consumer queues model करें: bounded buffers (backpressure), multiple consumers और सहज completion।
Channels के साथ producer/consumer (सर्वेक्षण), CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 3 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।
अवधारणा और लक्ष्य
लक्ष्य: सुरक्षित उत्पादक-उपभोक्ता प्रवाह-श्रृंखला बनाना।
- चैनल का विचार: उत्पादकों और उपभोक्ताओं के बीच एक queue
- सीमित आकार की क्षमता दबाव-वापसी प्रदान करती है
- कई उपभोक्ताओं का समर्थन करें
- साफ़-सुथरे बंद होने के लिए CompleteAdding का उपयोग करें
एक उत्पादक और एक उपभोक्ता
मूल प्रवाह: उत्पादक Add करते हैं, उपभोक्ता GetConsumingEnumerable पर पुनरावृत्ति करते हैं और अंत में समाप्त करने के लिए CompleteAdding चलाया जाता है।
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
// Unbounded by default; simple demo
BlockingCollection<int> queue = new BlockingCollection<int>();
// Producer
Task producer = Task.Run(() =>
{
for (int i = 1; i <= 5; i++)
{
queue.Add(i); // enqueue
Console.WriteLine("Produced " + i);
Thread.Sleep(50); // simulate work
}
queue.CompleteAdding(); // signal no more items
});
// Consumer
Task consumer = Task.Run(() =>
{
foreach (int x in queue.GetConsumingEnumerable())
{
Console.WriteLine("Consumed " + x);
Thread.Sleep(80); // simulate processing
}
Console.WriteLine("Consumer done");
});
Task.WaitAll(producer, consumer);
}
}
दबाव-वापसी का उदाहरण
सीमित आकार वाली queues दबाव-वापसी लागू करती हैं: queue भर जाने पर Add तब तक रुकता है, जब तक उपभोक्ता स्थान उपलब्ध नहीं करा देते।
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
// Bounded capacity introduces backpressure
BlockingCollection<int> queue = new BlockingCollection<int>(boundedCapacity: 2);
Task producer = Task.Run(() =>
{
for (int i = 1; i <= 5; i++)
{
queue.Add(i); // blocks when the buffer is full
Console.WriteLine("Produced " + i + " (count=" + queue.Count + ")");
}
queue.CompleteAdding();
});
Task consumer = Task.Run(() =>
{
foreach (int x in queue.GetConsumingEnumerable())
{
Console.WriteLine("Consumed " + x);
Thread.Sleep(120); // slower consumer -> producer will block sometimes
}
});
Task.WaitAll(producer, consumer);
}
}
उपभोक्ताओं में कार्य-वितरण
कई उपभोक्ता वस्तुओं के लिए प्रतिस्पर्धा करते हैं। कार्य थ्रेडों में अपने-आप बाँट दिया जाता है।
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
BlockingCollection<int> queue = new BlockingCollection<int>(3);
Task prod = Task.Run(() =>
{
for (int i = 1; i <= 8; i++)
{
queue.Add(i);
Console.WriteLine("Produced " + i);
Thread.Sleep(30);
}
queue.CompleteAdding();
});
// Start 2 consumers that compete for items
Task[] consumers = Enumerable.Range(1, 2).Select(id => Task.Run(() =>
{
foreach (int x in queue.GetConsumingEnumerable())
{
Console.WriteLine("C" + id + " got " + x);
Thread.Sleep(100);
}
Console.WriteLine("C" + id + " done");
})).ToArray();
Task.WaitAll(consumers.Concat(new[] { prod }).ToArray());
}
}
साफ़-सुथरी पूर्णता
queue खाली होने पर साफ़-सुथरे ढंग से समाप्त करने के लिए CompleteAdding और GetConsumingEnumerable का उपयोग करें।
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static void Producer(BlockingCollection<string> q)
{
string[] lines = { "A", "B", "C", "D" };
foreach (var s in lines)
{
q.Add(s);
Console.WriteLine("Produced " + s);
}
q.CompleteAdding(); // signal completion
}
static void Consumer(BlockingCollection<string> q)
{
try
{
foreach (var item in q.GetConsumingEnumerable())
{
Console.WriteLine("Consumed " + item);
Thread.Sleep(60);
}
Console.WriteLine("Consumer finished all items");
}
catch (InvalidOperationException)
{
// Thrown if taken after completion and empty; avoided by foreach above.
}
}
public static void Main(string[] args)
{
var queue = new BlockingCollection<string>(2);
Task p = Task.Run(() => Producer(queue));
Task c = Task.Run(() => Consumer(queue));
Task.WaitAll(p, c);
}
}
सुझाव और संभावित समस्याएँ
सुझाव:
- मेमोरी बढ़ने से रोकने के लिए सीमित आकार वाले बफ़र को प्राथमिकता दें।
- पूर्णता के समय होने वाली दौड़ से बचने के लिए GetConsumingEnumerable का उपयोग करें।
- कार्य-वस्तुओं को छोटा और स्वतंत्र रखें; साझा स्थिति से बचें।
- उपभोक्ताओं के भीतर त्रुटियों का लॉग दर्ज करें और उन्हें संभालें, ताकि कार्य चुपचाप न रुकें।
CompleteAdding का उद्देश्य
पुनरावलोकन
पुनरावलोकन: चैनलों का अनुकरण करने के लिए सीमित आकार वाली BlockingCollection का उपयोग करें, कार्य को कई उपभोक्ताओं में बाँटें और शालीनतापूर्वक बंद करने के लिए CompleteAdding चलाएँ।
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Channels के साथ producer/consumer (सर्वेक्षण)” पाठ निःशुल्क है?
हाँ—“Channels के साथ producer/consumer (सर्वेक्षण)” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।
“Channels के साथ producer/consumer (सर्वेक्षण)” में मैं क्या सीखूँगा?
BlockingCollection का उपयोग करके Channels जैसी producer/consumer queues model करें: bounded buffers (backpressure), multiple consumers और सहज completion। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 3 में से 2वाँ पाठ है।
“Channels के साथ producer/consumer (सर्वेक्षण)” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Parallel.ForEach, PLINQ
- Channels के साथ producer/consumer (सर्वेक्षण)
- Throughput बनाम latency के trade-offs