صف حلقه رویداد
صف حلقه رویداد
onscroll, request 1 <— Process 1 starts
onscroll, request 2
response 1 <— Process 2 starts
onscroll, request 3
response 2
response 3
onscroll, request 4
onscroll, request 5
onscroll, request 6
response 4
onscroll, request 7 <— Process 1 finishes
response 6
response 5
response 7 <— Process 2 finishes
“فرآیند 1” و “فرآیند 2” به طور همزمان اجرا می شوند (موازی در سطح کار)، اما رویدادهای فردی آنها به صورت متوالی در صف حلقه رویداد اجرا می شوند.
به هر حال، توجه کنید که چگونه پاسخ 6 و پاسخ 5 از نظم مورد انتظار خارج شدند؟
حلقه رویداد تک رشته ای یکی از بیان های همزمانی است (مطمئنا موارد دیگری نیز وجود دارد که بعداً به آنها خواهیم پرداخت)
بدون تعامل
از آنجایی که دو یا چند “فرآیند” مراحل/رویدادهای خود را به طور همزمان در یک برنامه به هم میپیوندند، اگر وظایف نامرتبط باشند، لزوماً نیازی به تعامل با یکدیگر ندارند. اگر آنها تعامل نداشته باشند، عدم جبرگرایی کاملاً قابل قبول است.
مثلا:
var res = {};
function foo(results) {
res.foo = results;
} f
unction bar(results) {
res.bar = results;
} /
/ ajax(..) is some arbitrary Ajax function given by a library
ajax( “http://some.url.1”, foo );
ajax( “http://some.url.2”, bar );
foo() و bar() دو “فرایند” همزمان هستند، و مشخص نیست که با کدام ترتیب شلیک می شوند. اما ما برنامه را طوری ساخته ایم که مهم نیست به چه ترتیبی شلیک می کنند، زیرا آنها به طور مستقل و به عنوان عمل می کنند. چنین نیازی به تعامل ندارند.
این یک اشکال “شرایط مسابقه” نیست، زیرا بدون در نظر گرفتن ترتیب، کد همیشه به درستی کار می کند.
اثر متقابل
معمولاً، “فرآیندهای” همزمان، به طور غیرمستقیم از طریق دامنه و/یا DOM، ضرورتاً با هم تعامل خواهند داشت. هنگامی که چنین تعاملی رخ می دهد، باید این تعاملات را برای جلوگیری از “شرایط مسابقه”، همانطور که قبلاً توضیح دادیم، هماهنگ کنید.
در اینجا یک مثال ساده از دو “فرآیند” همزمان وجود دارد که به دلیل سفارش ضمنی که فقط گاهی اوقات شکسته می شود، با هم تعامل دارند:
var res = [];
function response(data) {
res.push( data );
} /
/ ajax(..) is some arbitrary Ajax function given by a library
ajax( “http://some.url.1”, response );
ajax( “http://some.url.2”, response );
“فرآیندهای” همزمان دو فراخوانی ()response هستند که برای رسیدگی به پاسخ های Ajax ساخته می شوند. آنها می توانند به ترتیب اول اتفاق بیفتند
بیایید فرض کنیم رفتار مورد انتظار این است که res[0] نتایج تماس “http://some.url.1” و res[1] نتایج “http://some.url.2” را داشته باشد. زنگ زدن. گاهی اوقات اینطور خواهد بود، اما گاهی اوقات بسته به اینکه کدام تماس اول تمام شود، آنها برگردانده می شوند. احتمال بسیار خوبی وجود دارد که این عدم قطعیت یک اشکال “شرایط نژادی” باشد
قوانین ارسال دیدگاه در سایت