سؤال

هل هو متعمد تصميم مقرر أو مشكلة لدينا اليوم الحالي المتصفحات التي سيتم تصحيحه في الإصدارات القادمة?

هل كانت مفيدة؟

المحلول

جافا سكريبت لا دعم متعدد خيوط لأن مترجم جافا سكريبت في المتصفح هو موضوع واحد (AFAIK).حتى جوجل كروم لن تسمح صفحة ويب واحدة جافا سكريبت تشغيل وقت واحد لأن هذا من شأنه أن يسبب ضخمة مشكلات التوافق في صفحات الويب الموجودة.جميع كروم لا يتم فصل مكونات متعددة (علامات تبويب مختلفة, الإضافات, إلى آخره) في عمليات منفصلة ، ولكن لا أستطيع أن أتخيل صفحة واحدة بعد اكثر من جافا سكريبت الموضوع.

ومع ذلك يمكنك استخدام ، كما اقترح ، setTimeout للسماح نوعا من جدولة و "وهمية" التزامن.يؤدي هذا المتصفح لاستعادة السيطرة على تقديم الموضوع, و تبدأ شفرة جافا سكريبت الموردة setTimeout بعد عدد معين من ميلي ثانية.هذا مفيد جدا إذا كنت تريد أن تسمح العرض (ما ترى) لتحديث أثناء إجراء العمليات عليها.فقط من خلال حلقات مثلاالإحداثيات تحديث عنصر وعليه سوف تتيح لك معرفة بداية ونهاية المواقف, ولا شيء بين بين.

نحن نستخدم فكرة مجردة في مكتبة جافا سكريبت الذي يسمح لنا لخلق عمليات المواضيع التي كلها تدار من قبل نفس مترجم جافا سكريبت.وهذا يسمح لنا بتشغيل الإجراءات على النحو التالي:

  • عملية, الموضوع: 1
  • عملية, موضوع 2
  • العملية ب الموضوع: 1
  • عملية, موضوع 3
  • عملية, موضوع 4
  • العملية ب الموضوع 2
  • وقفة عملية
  • العملية ب الموضوع 3
  • العملية ب 4 موضوع
  • العملية ب ، 5 موضوع
  • تبدأ عملية
  • عملية, موضوع 5

هذا يسمح بعض شكل جدولة مزيفة التوازي ، بدء وإيقاف من المواضيع ، إلى آخره ، ولكن ذلك لن يكون صحيحا خيوط المعالجة المتعددة.أنا لا أعتقد أنه سوف يكون من أي وقت مضى ينفذ في اللغة نفسها ، منذ صحيح متعدد خيوط مفيدة فقط إذا كان المتصفح يمكن تشغيل صفحة واحدة متعددة الخيوط (أو حتى أكثر من واحد الأساسية) ، والصعوبات هناك أكبر من الإمكانيات الإضافية.

من أجل مستقبل جافا سكريبت التحقق من ذلك:https://developer.mozilla.org/presentations/xtech2006/javascript/

نصائح أخرى

تقليديا, JS كان المقصود قصيرة وسريعة-تشغيل قطعة من التعليمات البرمجية.إذا كان لديك الرئيسية الحسابات يحدث, يمكنك فعل ذلك على الخادم فكرة JS+HTML التطبيق التي شغلت في المتصفح الخاص بك لفترات طويلة من الوقت في القيام غير أشياء تافهة وسخيفة.

بالطبع, الآن لدينا ذلك.ولكن سوف يستغرق قليلا المتصفحات للحاق - معظمهم تم تصميمها حول مجموعة واحدة مترابطة نموذج تغيير هذا ليس من السهل.جوجل التروس الجانب الخطوات الكثير من المشاكل المحتملة التي تتطلب أن خلفية إعدام معزولة لا تغيير دوم (لأن هذا ليس موضوع آمن) ، أي الوصول إلى الكائنات التي تم إنشاؤها بواسطة الخيط الرئيسي (كما سبق).في حين تقييدي هذا من المرجح أن تكون الأكثر عملية التصميم في المستقبل القريب ، سواء لأنه يبسط تصميم المتصفح ، لأنه يقلل من خطر المشاركة في السماح الخبرة شبيبة المبرمجون العبث مع المواضيع...

@مارسيو:

لماذا هذا سبب عدم تنفيذ متعددة خيوط المعالجة في جافا سكريبت ؟ المبرمجين يمكن أن تفعل ما تريد مع أدوات لديهم.

لذا دعنا لا نعطيهم الأدوات التي هي سهلة جدا سوء استخدام أن كل موقع آخر يمكنني فتح ينتهي تعطل المتصفح الخاص بي.ساذجة تنفيذ هذا سوف تجلب لك مباشرة إلى الأراضي التي تسببت MS الكثير من الصداع خلال IE7 التنمية:إضافة على المؤلفين لعب سريع و فضفاضة مع طراز مؤشر الترابط ، مما أدى إلى إخفاء الأخطاء التي أصبح واضحا عندما وجوه دورات الحياة تغير على مؤشر ترابط الأساسي.سيئة.إذا كنت تكتب متعددة الخيوط ActiveX add-ons for IE, أعتقد أنه يأتي مع الإقليم ؛ لا يعني أنه يجب أن تذهب أبعد من ذلك.

جافا سكريبت متعدد خيوط (مع بعض القيود) هنا.نفذت جوجل العمال التروس ، والعمال يتم تضمينها مع HTML5.معظم المتصفحات بالفعل واضاف لدعم هذه الميزة.

موضوع سلامة البيانات مضمونة لأن كل البيانات ترسل إلى/من عامل هو تسلسل/نسخ.

لمزيد من المعلومات اقرأ:

http://www.whatwg.org/specs/web-workers/current-work/

http://ejohn.org/blog/web-workers/

أنا لا أعرف حيثيات هذا القرار ، ولكن أنا أعلم أنه يمكنك محاكاة بعض من فوائد متعددة الخيوط البرمجة باستخدام setTimeout.يمكنك ان تعطي الوهم من عمليات متعددة تفعل أشياء في نفس الوقت, على الرغم من أن في الواقع, كل شيء يحدث في موضوع واحد.

فقط لديك وظيفة الخاص بك تفعل قليلا من العمل ، ومن ثم استدعاء شيئا مثل:

setTimeout(function () {
    ... do the rest of the work...
}, 0);

وغيرها من الأشياء التي تحتاج إلى القيام به (مثل واجهة المستخدم التحديثات, الصور المتحركة, الخ) سوف يحدث عندما تحصل على فرصة.

Multithread.js يلتف ويب العمال و يسمح لسهولة خاصية تعدد في JS.يعمل على جميع المتصفحات الجديدة ، بما في ذلك دائرة الرقابة الداخلية سفاري.:)

تقصد لماذا لا يدعم اللغة خاصية تعدد أو لماذا لا جافا سكريبت في محركات المتصفحات تدعم خاصية تعدد ؟

الجواب على السؤال الأول هو أن جافا سكريبت في المتصفح هو من المفترض أن يكون في رمل و في آلة/OS-وسيلة مستقلة ، إضافة خاصية تعدد الدعم من شأنه أن يعقد اللغة التعادل اللغة بشكل وثيق جدا على نظام التشغيل.

تماما كما مات ب وقال: المسألة ليست واضحة جدا.على افتراض أن كنت تسأل عن دعم خاصية تعدد في اللغة:لأنه ليس هناك حاجة 99.999% من التطبيقات التي تعمل في المتصفح حاليا.إذا كنت حقا في حاجة إليها ، هناك حلول بديلة (مثل استخدام نافذة.setTimeout).

في خاصية تعدد جدا ، جدا ، جدا ، جدا ، جدا ، جدا بجد (هل قلت أنه صعب؟) للحصول على حق, إلا إذا كنت تضع المزيد من القيود (مثل فقط باستخدام البيانات ثابتة).

إنتل قد تم القيام ببعض البحوث ذات المصدر المفتوح على خاصية تعدد في جافا سكريبت ، تم عرضها مؤخرا على GDC 2012.هنا هو رابط فيديو.المجموعة البحثية المستخدمة OpenCL الذي يركز في المقام الأول على رقاقة إنتل مجموعات نظام التشغيل ويندوز.المشروع هو رمز المسمى الناس بالضيق و الكود هو متاحة على جيثب

بعض الروابط المفيدة:

بناء الحوسبة السريع لتطبيقات الويب

حاليا بعض المتصفحات لا تدعم خاصية تعدد.حتى, إذا كنت بحاجة إلى ذلك يمكن استخدام محددة المكتبات.على سبيل المثال, عرض المواد التالية:

Node.js 10.5+ يدعم المواضيع عامل كما ميزة تجريبية (يمكنك استخدامه مع --التجريبية-عامل العلم تمكين): https://nodejs.org/api/worker_threads.html

لذا ، فإن القاعدة هي:

  • إذا كنت بحاجة إلى القيام به I/O bound ops, ثم استخدام آلية داخلية (الملقب رد/وعد/المتزامن-انتظار)
  • إذا كنت بحاجة إلى القيام به وحدة المعالجة المركزية لا بد ops, ثم استخدام مؤشرات ترابط worker.

المواضيع عامل يقصد أن الذين يعيشون منذ فترة طويلة المواضيع ، وهذا يعني أنك تفرخ خلفية الموضوع ثم يمكنك التواصل معها عبر تمرير الرسائل.

وإلا إذا كنت بحاجة إلى تنفيذ الثقيلة تحميل وحدة المعالجة المركزية مع وظيفة مجهول, ثم يمكنك الذهاب مع https://github.com/wilk/microjob, صغيرة المكتبة بنيت حول المواضيع عامل.

إنها تطبيقات هذا لا دعم متعدد خيوط المعالجة.حاليا جوجل التروس هو توفير وسيلة إلى استخدام بعض شكل من التوافق من خلال تنفيذ العمليات الخارجية ولكن ذلك حول هذا الموضوع.

المتصفح الجديد جوجل هو من المفترض أن تفرج اليوم (جوجل كروم) تنفيذ بعض التعليمات البرمجية في موازاة ذلك عن طريق فصل في العملية.

اللغة الأساسية بالطبع يمكن أن يكون لها نفس الدعم كما يقول جافا ، ولكن الدعم عن شيء مثل إرلانج هذا التزامن هو أي مكان بالقرب من الأفق.

بقدر ما لدي من أخبار جوجل كروم سوف يكون مؤشرات جافا سكريبت, لذلك هو "التطبيقات الحالية" المشكلة.

وفقا هذه المادة فمن الممكن بالفعل أن تنفيذ جافا سكريبت خيوط.

بدون دعم اللغة موضوع مزامنة, بل لا معنى تطبيقات جديدة في محاولة.المعقدة القائمة شبيبة التطبيقات (على سبيل المثالأي شيء باستخدام ExtJS) على الأرجح تحطم بشكل غير متوقع ، ولكن دون synchronized الكلمات الرئيسية أو شيئا من هذا القبيل ، كما أنه سيكون من الصعب جدا بل من المستحيل أن تكتب البرامج الجديدة التي تتصرف بشكل صحيح.

ومع ذلك يمكنك استخدام الدالة eval لتحقيق التزامن إلى حد ما

/* content of the threads to be run */
var threads = [
        [
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');"
        ],
        [
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');"
        ]
    ];

window.onload = function() {
    var lines = 0, quantum = 3, max = 0;

    /* get the longer thread length */
    for(var i=0; i<threads.length; i++) {
        if(max < threads[i].length) {
            max = threads[i].length;
        }
    }

    /* execute them */
    while(lines < max) {
        for(var i=0; i<threads.length; i++) {
            for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
                eval(threads[i][j]);
            }
        }
        lines += quantum;
    }
}

يمكنك استخدام jetworker, المجمع على webworker https://github.com/uxitten/jetworker

متعدد خيوط مع جافا سكريبت هو واضح ممكن باستخدام webworkers يحقق من خلال HTML5.

الفرق الرئيسي بين webworkers القياسية متعدد خيوط بيئة موارد الذاكرة ليست مشتركة مع موضوع الرئيسي ، مرجع إلى كائن غير مرئي من موضوع واحد إلى آخر.المواضيع التواصل من خلال تبادل الرسائل ، ولذلك فمن الممكن لتنفيذ synchronzization و المتزامنة استدعاء أسلوب الخوارزمية التالية الحدث يحركها تصميم نمط.

العديد من الأطر موجود السماح هيكل programmation بين المواضيع ، من بينها OODK-شبيبة ، OOP شبيبة إطار دعم البرمجة المتزامنة https://github.com/GOMServices/oodk-js-oop-for-js

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top