কোনও ইভেন্টের লুপটি কেবল অনুকূলিতকরণের ভোটদানের সাথে / যখন লুপের জন্য?


55

আমি ইভেন্ট লুপটি কী তা বোঝার চেষ্টা করছি। প্রায়শই ব্যাখ্যাটি হ'ল কোনও ইভেন্টের লুপে আপনি কিছু না কিছুক্ষণ অবধি না ঘটে যে কোনও ঘটনা ঘটেছে event তারপরে আপনি ইভেন্টটি পরিচালনা করবেন এবং আপনি আগে যা করছেন তা করা চালিয়ে যান।

উদাহরণ সহ উপরের সংজ্ঞাটি মানচিত্র করা To আমার কাছে এমন একটি সার্ভার রয়েছে যা ইভেন্ট লুপে 'শোন' এবং যখন কোনও সকেট সংযোগ শনাক্ত করা হয়, তখন সেখান থেকে প্রাপ্ত ডেটাগুলি পড়তে এবং প্রদর্শিত হয়ে যায়, তারপরে সার্ভারটি পুনরায় শুরু / শোনা শুরু করে যেমনটি আগের মতো হয়েছিল।


যাইহোক, এই ইভেন্টটি ঘটছে এবং আমাদের 'ঠিক ঠিক তেমনভাবে' বিজ্ঞপ্তি দেওয়া আমার পক্ষে হ্যান্ডেল করার মতো অনেক কিছুই। আপনি বলতে পারেন: "এটি 'ঠিক তেমন নয়' আপনার ইভেন্ট শ্রোতার নিবন্ধন করতে হবে"। তবে ইভেন্ট শ্রোতা কী তবে কোনও ফাংশন যা কোনও কারণে ফিরে আসেনি। এটি কি নিজের লুপের মধ্যে রয়েছে, কোনও ঘটনা ঘটে যাওয়ার পরে অবহিত হওয়ার অপেক্ষায় আছে? ইভেন্ট শ্রোতাদেরও কি কোনও ইভেন্ট শ্রোতার নিবন্ধন করা উচিত? কোথায় শেষ?


ইভেন্টগুলি কাজ করার জন্য একটি দুর্দান্ত বিমূর্তি, তবে এটি কেবল একটি বিমূর্ততা। আমি বিশ্বাস করি যে শেষ পর্যন্ত, ভোটগ্রহণ অনিবার্য। সম্ভবত আমরা এটি আমাদের কোডে করছি না, তবে নিম্ন স্তরের (প্রোগ্রামিং ল্যাঙ্গুয়েজ বাস্তবায়ন বা ওএস) এটি আমাদের জন্য করছে।

এটি মূলত নীচের সিউডো কোডে নেমে আসে যা কোথাও কম নিচে চলছে তাই এটি ব্যস্ততার জন্য অপেক্ষা না করে:

while(True):
    do stuff
    check if event has happened (poll)
    do other stuff

এটি সম্পূর্ণ ধারণা সম্পর্কে আমার বোঝাপড়া, এবং আমি এটি সঠিক কিনা তা শুনতে চাই। আমি সম্পূর্ণরূপে ধারণাটি মূলতঃ ভুল তা গ্রহণে উন্মুক্ত, সেক্ষেত্রে আমি সঠিক ব্যাখ্যাটি চাই।


3
ইভেন্ট সিস্টেমগুলি পর্যবেক্ষক প্যাটার্নের বাস্তবায়ন । প্যাটার্নটি বোঝার সাথে আপনার ইভেন্টগুলির বোঝার সীমাবদ্ধ হওয়া উচিত। কোনও ভোটগ্রহণের প্রয়োজন নেই।
স্টিভেন ইভার্স

1
চূড়ান্তভাবে হ্যাঁ, এমনকি ভাষা যদি এটি বিমূর্ত করে তোলে।
গ্র্যান্ডমাস্টারবি

আপনার উইকি লিঙ্কে EventSourceকীবোর্ড ইনপুটটি পোলিং না করে কী করছেন?
TheMeaningfulEngineer

@ অ্যালান: এটি কিছু করতে পারে তবে কীবোর্ডের ইনপুটগুলির জন্য বিশেষত আপনার অ্যাপ্লিকেশনগুলিকে কীবোর্ড ইভেন্ট শোনার জন্য নিবন্ধিত করার জন্য উপস্থিত রয়েছে, যা আপনি কোনও পোলিং জড়িত না করেই আপনার ইভেন্টসোর্স হিসাবে ব্যবহার করতে পারেন। অবশ্যই, আপনি যদি যথেষ্ট পরিমাণে নিচে যান তবে ইউএসবি সর্বদা পোলিং হয় তবে ধরে নেওয়া যাক আমরা একটি পিএস / 2 কীবোর্ড ব্যবহার করছি যা বাধাগ্রস্ত হয় এবং তারপরে শূন্য পোলিং সহ ইভেন্টগুলির উপর ভিত্তি করে আপনার কাছে একটি কীবোর্ড ইনপুট স্ট্যাক রয়েছে।
ফোশি

আমি বছরের পর বছর এই প্রশ্নগুলি করেছি, তবে কেন আমি কখনই এটি জিজ্ঞাসা করতে বিরক্ত করি তা বলতে পারি না। ধন্যবাদ, আমি কার্ল বিলেফেল্ট আমাকে আলোকিত করেছি এই বোঝার সাথে আমি এখন সন্তুষ্ট।
0xc0de

উত্তর:


54

কোনও ইভেন্ট প্রস্তুত না থাকলে বেশিরভাগ ইভেন্টের লুপগুলি স্থগিত করবে, যার অর্থ অপারেটিং সিস্টেম কোনও ইভেন্ট না হওয়া পর্যন্ত টাস্ককে কার্যকর করার সময় দেয় না।

বলুন ইভেন্টটি চাপ দেওয়া হচ্ছে একটি কী is অপারেটিং সিস্টেমের কোনও কিপ্রেস চেক করার জন্য কোনও লুপ রয়েছে কিনা তা আপনি জানতে চাইতে পারেন। উত্তর না হয়। কীগুলি টিপানো হচ্ছে একটি বাধা তৈরি করে , যা হার্ডওয়্যার দ্বারা সংযোজনীয়ভাবে পরিচালনা করা হয়। একইভাবে টাইমার, মাউস মুভমেন্ট, একটি প্যাকেট আগত ইত্যাদি

আসলে, বেশিরভাগ অপারেটিং সিস্টেমের জন্য, ইভেন্টগুলির জন্য পোলিং অ্যাবস্ট্রাকশন। হার্ডওয়্যার এবং ওএস ইভেন্টগুলি অবিচ্ছিন্নভাবে পরিচালনা করে এবং সেগুলিকে একটি সারিতে রাখে যা অ্যাপ্লিকেশনগুলির মাধ্যমে পোল করা যায়। আপনি কেবল এম্বেড থাকা সিস্টেমে হার্ডওয়্যার পর্যায়ে সত্যই পোলিং দেখতে পাবেন এবং এমনকি সর্বদা সেখানে নেই।


4
একটি বাধা কি তারে ভোল্টেজ পরিবর্তন হয় না? এটি কি কোনও ইভেন্ট নিজে থেকেই ট্রিগার করতে পারে বা আমাদের ভোল্টেজের মানটির জন্য পিনটি পোল করতে হবে?
TheMeaningfulEngineer

8
এটি নিজেই একটি ইভেন্ট ট্রিগার করতে পারে। প্রসেসরটি সেভাবে ডিজাইন করা হয়েছে। আসলে একটি প্রসেসর একটি বিঘ্নিত দ্বারা ঘুম থেকে জেগে উঠতে পারে।
কার্ল বিলেফেল্ড

2
আমি বিবৃতি দিয়ে বিভ্রান্ত Most event loops will block। এটি কীভাবে "ইভেন্ট লুপের দৃষ্টান্তের সাথে থ্রেড ব্যবহারের বিপরীতে নন-ব্লকিং অ্যাসিনক্রোনাস কলগুলি ব্যবহার করে"?
TheMeaningfulEngineer

1
আপনি যদি জিটিকে + এর মতো লাইব্রেরির ইভেন্ট লুপগুলি লক্ষ্য করেন তবে তারা নতুন ইভেন্টগুলির জন্য পরীক্ষা করে তারপরে একটি লুপে ইভেন্ট হ্যান্ডলারদের কল করুন, তবে যদি কোনও ইভেন্ট না হয় তবে সেগুলি সেমফোর বা একটি টাইমার বা অন্য কোনও কিছুতে অবরুদ্ধ করে। পৃথক বিকাশকারীরা তাদের নিজস্ব ইভেন্ট লুপগুলি তৈরি করে যা খালি ইভেন্টের কাতারে অবরুদ্ধ হয় না, তবে বহুল ব্যবহৃত ব্যবহৃত লাইব্রেরিগুলি সমস্ত ব্লক করে। ইভেন্ট লুপগুলি অন্যথায় খুব অদক্ষ।
কার্ল বিলেফেল্ট 21

1
আমি মনে করি আপনি এটি সেভাবে দেখতে পারেন তবে এটি অ্যাপ্লিকেশন কোডের চেয়ে গ্রন্থাগার এবং / অথবা ওএসে মাল্টি থ্রেডিং। ইভেন্ট লুপগুলি অ্যাপ্লিকেশন বিকাশকারীকে সিঙ্ক্রোনাইজেশন সমস্যাগুলি দূরে রাখে।
কার্ল বিলেফেল্ট 21

13

আমি ইভেন্ট শ্রোতার কথা মনে করি কোনও ফাংশন তার নিজস্ব লুপটি চালাচ্ছে না, বরং প্রথম রানার সাথে শুরু করার বন্দুকের অপেক্ষায় থাকা রিলে রেস হিসাবে। ভোটদানের পরিবর্তে ইভেন্টগুলি ব্যবহারের একটি উল্লেখযোগ্য কারণ হ'ল তারা সিপিইউ চক্রের সাথে আরও দক্ষ। কেন? এটিকে হার্ডওয়্যার আপ থেকে দেখুন (উত্স কোডটি নীচে না দিয়ে)।

একটি ওয়েব সার্ভার বিবেচনা করুন। যখন আপনার সার্ভার কল করে listen()এবং ব্লক করে, আপনার কোডটি রিলে রানার হিসাবে এটির স্থান নিচ্ছে। যখন কোনও নতুন সংযোগের প্রথম প্যাকেট আসে, নেটওয়ার্ক কার্ড অপারেটিং সিস্টেমটিতে বাধা দিয়ে রেস শুরু করে। ওএস একটি বিঘ্নিত পরিষেবা রুটিন (আইএসআর) চালায় যা প্যাকেটটি ধরে। আইএসআর ব্যাটনটি একটি উচ্চ-স্তরের রুটিনে পাস করে যা সংযোগ স্থাপন করে। একবার সংযোগটি জীবিত হয়ে গেলে, সেই রুটিনটি ব্যাটনটি এতে listen()চলে যায়, যা আপনার কোডে ব্যাটনটি পাস করে। এই মুহুর্তে, আপনি সংযোগের সাথে যা চান তা করতে পারেন। আমরা জানি যে সমস্ত রেসের মধ্যে প্রতিটি রিলে রানার পাব যেতে পারে to ইভেন্ট বিমূর্ততার একটি শক্তি হ'ল আপনার কোডটি জানতে বা যত্ন নিতে হবে না।

কিছু অপারেটিং সিস্টেমে ইভেন্ট-হ্যান্ডলিং কোড অন্তর্ভুক্ত থাকে যা তার দৌড়ের অংশটি চালায়, লাঠিয়ালটি বন্ধ করে দেয়, তারপরে পরবর্তী দৌড়ের জন্য অপেক্ষা করার জন্য তার শুরুতে ফিরে আসে। সেই অর্থে, ইভেন্ট হ্যান্ডলিংটি প্রচুর পরিমাণে সমবর্তী লুপগুলিতে ভোটগ্রহণকে অনুকূলিত করে তুলেছে। তবে, সর্বদা একটি বাইরের ট্রিগার থাকে যা প্রক্রিয়াটি সরিয়ে দেয়। ইভেন্ট শ্রোতা এমন কোনও ফাংশন নয় যা প্রত্যাবর্তন করছে না, তবে এমন একটি ফাংশন যা এটি চালানোর আগেই বাহ্যিক ট্রিগারটির জন্য অপেক্ষা করছে is বরং:

while(True):
    do stuff
    check if event has happened (poll)
    do other stuff

আমি এই হিসাবে মনে করি:

on(some event):    //I got the baton
     do stuff
     signal the next level up    //Pass the baton

এবং signalহ্যান্ডলারটি চলমান এবং পরবর্তী সময়ের মধ্যে, ধারণাগতভাবে কোনও কোড চলমান বা লুপিং নেই।


এটি বোধগম্য হয়, তবে ইভেন্ট লুপটি যখন বাধার জন্য অপেক্ষা করছে তখন কী করছে? যদি এটি অবরুদ্ধ হয়, তবে এটি 'মাল্টি থ্রেডড' পদ্ধতির নয় যা ইভেন্ট লুপের বিপরীতে দৃষ্টান্ত?
TheMeaningfulEngineer

যদি আপনার কোডটির লুপ থাকে forever: { select(); do stuff; }তবে আপনি প্রতিবার লুপের মাধ্যমে দৌড়ে পুনরায় প্রবেশ করছেন। আপনি একক থ্রেড থেকে বারবার তা করেন না বা পৃথক থ্রেড বা প্রসেসরের সমান্তরালে যাই হোক না কেন, আমি প্রতিটি ইভেন্টকে তার নিজস্ব জাতি হিসাবে মনে করি। উদাহরণস্বরূপ, একটি ওয়েব ব্রাউজার হ'ল একাধিক ইভেন্টের পৃথক থ্রেডে একাধিক ইভেন্ট লুপযুক্ত প্রোগ্রাম, কমপক্ষে ইউআই এর জন্য এবং এটি ডাউনলোড করা প্রতিটি পৃষ্ঠার জন্য একটি। কোডিংয়ের সময় আমি যে প্রশ্নটি করি তা হল "আমি কীভাবে ইভেন্টগুলিকে দ্রুত প্রসেস করতে পারি?" কখনও কখনও উত্তরটি একটি লুপ, কখনও থ্রেড, প্রায়শই সংমিশ্রণ হয়।
cxw

আমি কয়েক দশকেরও বেশি সময় ধরে ইভেন্ট-ভিত্তিক প্রোগ্রামিং করছি এবং আমি এই উত্তরটি খুব বিভ্রান্তিকর বলে মনে করেছি। শ্রোতাদের কাজ করার জন্য, অবশ্যই একটি লুপ থাকতে হবে যা কোনও ইভেন্টের জন্য অপেক্ষা করে, তারপরে এটি নিবন্ধিত সমস্ত শ্রোতার কাছে নিয়ে যায়। (ধরে নিই আমরা হার্ডওয়্যার বিঘ্নের চেয়ে সফ্টওয়্যার নিয়ে কথা বলছি)
ব্রায়ান ওকলে

8

এটি "অনুকূলিত পোলিং" নয়। একটি ইভেন্ট-লুপ ভোট দেওয়ার পরিবর্তে বিঘ্নিত চালিত I / O ব্যবহার করে।

যদিও, অবধি, ফর ইত্যাদি লুপগুলি পোলিং লুপ হয়।

"পোলিং" হ'ল বারবার কিছু পরীক্ষা করার প্রক্রিয়া। লুপ কোড ক্রমাগত executes এবং যেহেতু কারণ এটি একটি ছোট, "টাইট" লুপ, সেখানে সামান্য সময় প্রসেসর কর্ম স্যুইচ করুন এবং অন্য কিছু করার জন্য। প্রায় সমস্ত "হ্যাঙ্গ," "হিমশীতল", "" লকআপস "বা কম্পিউটার যখন কোনও প্রতিক্রিয়াহীন হয়ে যায় তখন আপনি যাকে কল করতে চান তা হ'ল কোডের উদ্ঘাটিত একটি অনিচ্ছাকৃত পোলিং লুপে আটকে রয়েছে। ইনস্ট্রুমেন্টেশন 100% সিপিইউ ব্যবহার দেখায়।

বিঘ্নিত-চালিত ইভেন্ট লুপগুলি পোলিং লুপগুলির চেয়ে অনেক বেশি দক্ষ। পোলিং সিপিইউ চক্রের একটি অত্যন্ত অপব্যয়মূলক ব্যবহার তাই এটিকে হ্রাস বা হ্রাস করার জন্য সর্বাত্মক চেষ্টা করা হয়।

তবে কোডের মানটি অনুকূল করতে, বেশিরভাগ ভাষাগুলি ইভেন্ট হ্যান্ডিং কমান্ডের জন্য পোলিং লুপের দৃষ্টান্তটি যথাসম্ভব ঘনিষ্ঠভাবে ব্যবহার করার চেষ্টা করে যেহেতু তারা কোনও প্রোগ্রামের মধ্যে কার্যকরভাবে অনুরূপ উদ্দেশ্যে পরিবেশন করে। সুতরাং, কীপ্রেস বা কোনও কিছুর জন্য অপেক্ষা করার জন্য পোলিং সবচেয়ে বেশি পরিচিত উপায় হ'ল অনভিজ্ঞদের পক্ষে এটি ব্যবহার করা এবং এমন কোনও প্রোগ্রামের সাথে চালিত করা সহজ যা নিজে নিজেই সূক্ষ্মভাবে চলতে পারে, তবে চলমান অবস্থায় আর কিছুই কার্যকর হয় না। এটি মেশিনটিকে "দখল" করেছে।

অন্যান্য উত্তরে যেমন ব্যাখ্যা করা হয়েছে, বিঘ্নিত-চালিত ইভেন্ট হস্তান্তরকালে, মূলত একটি "পতাকা" সিপিইউতে সেট করা থাকে এবং প্রক্রিয়াটিকে "স্থগিত" করা হয় (চালানোর অনুমতি দেওয়া হয় না) যতক্ষণ না অন্য পতাকাটি অন্য কোনও প্রক্রিয়া দ্বারা পরিবর্তিত হয় (যেমন কীবোর্ডের মতো ব্যবহারকারী কোনও কী চাপলে এটি পরিবর্তন করে)। পতাকাটি যদি একটি সত্যিকারের হার্ডওয়্যার শর্ত থাকে যেমন একটি রেখাটি "টানা উচ্চতর" হয় তবে এটিকে "বাধা" বা "হার্ডওয়্যার বিঘ্নিত" বলা হয়। বেশিরভাগ ক্ষেত্রে, সিপিইউতে বা মূল মেমোরিতে (র‌্যাম) কেবলমাত্র একটি মেমরি ঠিকানা হিসাবে প্রয়োগ করা হয় এবং তাকে "সেমফোরস" বলা হয়।

Semaphores সফ্টওয়্যার নিয়ন্ত্রণের অধীনে পরিবর্তন করা যেতে পারে এবং তাই সফ্টওয়্যার প্রক্রিয়াগুলির মধ্যে একটি খুব দ্রুত, সহজ সংকেত প্রক্রিয়া সরবরাহ করতে পারে।

বাধাগুলি কেবল হার্ডওয়্যার দ্বারা পরিবর্তন করা যায়। অভ্যন্তরীণ ঘড়ি চিপ দ্বারা নিয়মিত বিরতিতে ট্রিগার করা হ'ল বিঘ্নগুলির সবচেয়ে সর্বব্যাপী ব্যবহার। ক্লক বিঘ্ন দ্বারা সক্রিয় অগণিত সফটওয়্যার ক্রিয়াকলাপগুলির মধ্যে একটি হ'ল সেমোফোরগুলি পরিবর্তন।

আমি অনেক কিছু রেখেছি কিন্তু কোথাও থামতে হয়েছিল। আপনার আরও বিশদ প্রয়োজন কিনা দয়া করে জিজ্ঞাসা করুন।


7

সাধারণত উত্তরটি হ'ল হার্ডওয়্যার, ওএস এবং পটভূমির থ্রেডগুলি আপনি নিয়ন্ত্রণ করেন না এটি এটিকে অনায়াসে দেখানোর জন্য ষড়যন্ত্র করে। নেটওয়ার্ক কার্ডটি এমন কিছু ডেটা গ্রহণ করে যা সিপিইউকে জানাতে একটি বাধা দেয়। ওএসের বিঘ্নিত হ্যান্ডলার এটি পরিচালনা করে। তারপরে একটি পটভূমি থ্রেড যা আপনি নিয়ন্ত্রণ করেন না (এটি ইভেন্টটির নিবন্ধকরণের মাধ্যমে তৈরি হয়েছিল এবং আপনি ইভেন্টটির নিবন্ধভুক্ত হওয়ার পরে থেকেই ঘুমিয়ে ছিলেন) ইভেন্টটি পরিচালনা করার অংশ হিসাবে ওএস দ্বারা জেগে উঠেছে এবং আপনার ইভেন্ট হ্যান্ডলারটি চালায়।


7

আমি এখন পর্যন্ত যে সমস্ত উত্তর দেখেছি তার সবগুলির বিরুদ্ধে যাচ্ছি এবং "হ্যাঁ" বলব । আমি মনে করি অন্যান্য উত্তরগুলি জিনিসগুলিকে খুব জটিল করে তুলছে। ধারণার দিক থেকে, সমস্ত ইভেন্টের লুপগুলি মূলত:

while <the_program_is_running> {
    event=wait_for_next_event()
    process_event(event)
}

আপনি যদি প্রথমবার ইভেন্ট লুপগুলি বোঝার চেষ্টা করছেন, এগুলিকে একটি সাধারণ লুপ হিসাবে ভাবা কোনও ক্ষতি করবে না। কিছু অন্তর্নিহিত কাঠামো ওএসের জন্য একটি ইভেন্ট বিতরণ করার জন্য অপেক্ষা করছে, এটি পরে ইভেন্টটিকে এক বা একাধিক হ্যান্ডলারের দিকে পরিচালিত করে, তারপরে পরবর্তী ইভেন্টের জন্য অপেক্ষা করে, এবং আরও অনেক কিছু। এটি একটি অ্যাপ্লিকেশন সফ্টওয়্যার দৃষ্টিকোণ থেকে সত্যিই আছে।


1
সোজা হওয়ার জন্য +1। তবে জোর দেওয়া হচ্ছে "অপেক্ষা"; এই কোডটি কার্যকর করা লুপের প্রথম লাইনে এসে থামবে এবং কোনও ইভেন্ট না হওয়া পর্যন্ত চালিয়ে যাবে না। এটি ব্যস্ত ভোটদানের লুপের চেয়ে আলাদা যা বার বার কোনও ইভেন্ট না হওয়া পর্যন্ত কোনও ইভেন্টের জন্য পরীক্ষা করে থাকে।
টম প্যানিং

1

সমস্ত ইভেন্টের ট্রিগারগুলি লুপগুলিতে পরিচালনা করা হয় না। আমি প্রায়শই আমার নিজের ইভেন্ট ইঞ্জিনগুলি যেভাবে লিখি তা এরকম হবে:

interface Listener {
    void handle (EventInfo info);
}

List<Listener> registeredListeners

void triggerEvent (EventInfo info) {
    foreach (listener in registeredListeners) { // Memo 1
        listener.handle(info) // the handling may or may not be synchronous... your choice
    }
}

void somethingThatTriggersAnEvent () {
    blah
    blah
    blah
    triggerEvent(someGeneratedEventInfo)
    more blah
}

মনে রাখবেন যে মেমো 1 লুপে থাকলেও লুপটি প্রতিটি শ্রোতাকে অবহিত করার জন্য। ইভেন্ট ট্রিগার নিজেই অগত্যা কোনও লুপের মধ্যে নেই।

তত্ত্ব অনুসারে, ওএস-স্তরের কী ইভেন্টগুলি একই কৌশলটি ব্যবহার করতে পারে (যদিও আমি মনে করি তারা প্রায়শই এর পরিবর্তে পোলিং করে? আমি কেবল এখানে অনুমান করছি), তবে ওএস কোনও ধরণের registerListenerএপিআই প্রকাশ করে exp

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.