مهمة مصنع متسلسل وغير متوازي؟

لست خبيراً في الخيط ، لكني أردت تشغيل وظيفة N مرة في وقت واحد وبشكل متوازي وإذا لزم الأمر باستخدام أكثر من نواة عند توفرها.

لدي حاليًا الشفرة التالية:

tasks = new List();
for (int i = 0; i < _runThreads; i++)
{
    tasks.Add(Task.Factory.StartNew(() =>
    {
        GetRSS();
    }, stopAllTasks.Token));
}

نموذج GetRSS:

private void GetRSS()
{
    while (!queue.IsEmpty)
    {
        int total = 0;
       //dequeue, get url bla bla
        using (WebClient client = new WebClient())
        {
            //some code here get html content
        }
       //parse the rss bla bla
       //get the count of total items found 
       //update total variable with the total

        Interlocked.Add(ref counter, total);
    }
}

كما ترى ، في كود GetRSS ، أقوم بتحديث counter مع إجمالي الإدخالات لكل صفحة يحصل عليها ، حيث يحدد جهاز ضبط الوقت الخاص بي أنه يقوم بتحديث قيمة العداد إلى ملصق حتى أتمكن من رؤية التقدم.

من هذا ، لقد لاحظت أن المهام لا تعمل كلها مرة واحدة ولكنها في الواقع تعمل 1 في 1 حيث يقوم العداد بتحديث مبلغ X فقط ، أي ما يعادل وظيفة واحدة قيد التشغيل.

ومن هناك أعتقد أن الشفرة الواردة أعلاه لا تقوم بالفعل بتشغيل المهام بشكل متواز ولكن يبدو أنها تعمل في التسلسل.

  • هل هذا صحيح؟

  • إذا كان الأمر كذلك ، كيف أقوم بتحويل شفرتي بحيث يتم تشغيلها بالتوازي في الواقع؟

0
أنت تقوم بالوصول إلى الكائن المشار إليه بقائمة الانتظار غير المتزامنة. هذا خطأ سوف نادرا ما يظهر نفسه.
وأضاف المؤلف usr, مصدر
حتى ذلك الحين هو سباق فيما يتعلق بالتفرقع وملاعبة من ذلك.
وأضاف المؤلف usr, مصدر
كلا يتم تحديثها فقط من تلك الوظيفة وبغض النظر عن أن جهاز ضبط الوقت الخاص بي سوف يقرأها في وقت لاحق لتحديث التسمية في فترة 1 ثانية.
وأضاف المؤلف Guapo, مصدر
لدي حوالي 30 ألف صفحة في قائمة الانتظار ونعم هو عبارة عن كونتاسيكويو يقرأ من.
وأضاف المؤلف Guapo, مصدر
إنه موقع مستضاف محلي ولدي محاولة للتغلب على شفرتي الأصلية ، لذلك إذا كان هناك قيود تمنعني من الوصول إلى الصفحات بشكل أكبر ، فيجب أن تطرح استثناءً صحيحًا؟ أيضا لم أقم بتشغيل أكثر من 30 موضوعًا في المجموع من الاختبارات التي قمت بها حتى الآن.
وأضاف المؤلف Guapo, مصدر
في خادم لينكس يعمل على اباتشي في شبكتي المنزلية. svick في الواقع ، كنت أفعل ذلك بالفعل بينما كنا نواصل المحادثة.
وأضاف المؤلف Guapo, مصدر
يجب عليك إضافة بعض التسجيل لمعرفة ما يحدث بالفعل ، وليس مجرد تخمين. أو مجرد استخدام المصحح.
وأضاف المؤلف svick, مصدر
لن يتم تشغيل مهامك بالتوازي. هل هناك مكان آخر يتم فيه تحديث counter ؟
وأضاف المؤلف GETah, مصدر
ما هو حجم الطابور الخاص بك؟ هل تستخدم خادم التطوير (على افتراض أن عميل الويب يقوم بضرب رمزك الخاص)؟
وأضاف المؤلف Kenneth Ito, مصدر
ما لم تكن قائمة الانتظار ConcurrentQueue ؛ )
وأضاف المؤلف Kenneth Ito, مصدر
الصفحات في قائمة الانتظار تستهدف مجموعة متنوعة من المواقع؟ أو واحد فقط؟ يمكن أن يكون هدف واحد هو تقييد النتائج المتزامنة. مثال على ذلك هو موقع asp.net mvc الذي لم يتم ضبط الجلسة عليه للقراءة فقط على جهاز تحكم rss (يقوم بتسلسل مرات متزامنة).
وأضاف المؤلف Kenneth Ito, مصدر
أنا متأكد من أن خادم التطوير لديه قيود حول التزامن كذلك (غير متأكد ما إذا كان يسمح بالتزامن على الإطلاق). هل تستخدم خادم تطوير أو IIS؟
وأضاف المؤلف Kenneth Ito, مصدر
لا ، لن يمنعك أو يرمي استثناء ، وسوف يصطف في طوابير إذا كان هناك عدد كبير من النتائج المتزامنة.
وأضاف المؤلف Kenneth Ito, مصدر

1 إجابة

يجب أن تعمل شفرتك بالتوازي. اطلع على سؤال مماثل هنا .

أيضا ، قد تواجه الحد الأقصى للاتصال ، وهذا هو السبب في أنك قد تعتقد أنه يعمل بشكل تسلسلي. يمكنك استخدام التهيئة لتجاوز ذلك:

<?xml version="1.0" encoding="utf-8" ?>

    
        
            
        
    

0
وأضاف
أنا لم أركض أكثر من 10 إلى 20 موضوع في المرة الواحدة باستخدام win7 ، لذلك لا أعتقد أنني قد وصلت إلى 100 سلبيات ، ولكن شكرا على النصيحة.
وأضاف المؤلف Guapo, مصدر
لا تصدق ، لقد قمت بتصحيح الكثير من الأشياء ونزلت لمحاولة هذا وحلت المشكلة.
وأضاف المؤلف Guapo, مصدر