حلقهٔ رخداد

**حلقهٔ رخداد** (به انگلیسی: *Event Loop*) یا **حلقه رویداد** یک مکانیسم بنیادین در برنامه‌نویسی غیرهم‌زمان است که وظیفهٔ مدیریت رخدادها و اجرای کد در زمان مناسب را بر عهده دارد. این ساختار به زبان‌های برنامه‌نویسی مانند جاوااسکریپت، پایتون و محیط‌های اجرایی مانند نود جی‌اس اجازه می‌دهد عملیات I/O و سایر وظایف را بدون مسدود کردن اجرای ریسه (Thread) اصلی مدیریت کنند. برنامه نویسی رویدادمحور بر پایه حلقه رخداد استوار است.

## عملکرد حلقهٔ رخداد
حلقهٔ رخداد به‌طور مداوم وضعیت برنامه را پایش می‌کند و رخدادها را به ترتیب پردازش می‌کند. مراحل عملکرد شامل موارد زیر است:  
* **صف رویدادها (Event Queue):** رخدادها و وظایف آماده به اجرا در این صف قرار می‌گیرند.  
* **پشته فراخوانی (Call Stack):** وظایف هم‌زمان در پشتهٔ فراخوانی اجرا می‌شوند.  
* **فراخوان‌ها (Callbacks):** توابعی که پس از تکمیل یک عملیات غیرهم‌زمان اجرا می‌شوند.  

زمانی که پشتهٔ فراخوانی خالی می‌شود، حلقهٔ رخداد یک وظیفه از صف رویدادها را انتخاب و اجرا می‌کند. این فرآیند به‌طور پیوسته ادامه پیدا می‌کند.

## پیام‌رسانی در حلقه رخداد
در مدل حلقهٔ رخداد، پیام‌ها از **صف پیام‌ها (Message Queue)** به برنامه منتقل می‌شوند. هر پیام شامل اطلاعات مربوط به یک رویداد خاص است. حلقه رخداد این پیام‌ها را به ترتیب دریافت و تابع مربوطه را اجرا می‌کند.

## کاربردها
* **رابط‌های کاربری گرافیکی (GUI):** حلقهٔ رخداد مسئول مدیریت تعاملات کاربر، مانند کلیک‌ها و ورودی صفحه‌کلید است.  
* **سرورها:** حلقهٔ رخداد در سرورهای وب مانند نود.جی‌اس برای مدیریت تعداد زیادی از درخواست‌های ورودی و پاسخ‌گویی به آن‌ها به کار می‌رود.  
* **سیستم‌عامل‌ها:** بسیاری از سیستم‌عامل‌ها مانند ویندوز و مک‌اواس از حلقه رخداد برای مدیریت رویدادها استفاده می‌کنند.

## طراحی حلقه رخداد در یونیکس
در سیستم‌عامل یونیکس، تمامی عملیات ورودی/خروجی بر اساس فایل‌ها و شناسه‌های فایل (File Descriptors) انجام می‌شود. توابعی مانند `select()` و `poll()` برای پایش وضعیت فایل‌ها و ورودی/خروجی‌ها به کار می‌روند.

### مدیریت سیگنال‌ها در یونیکس
سیگنال‌ها در یونیکس به‌طور پیش‌فرض با حلقه رخداد همخوانی ندارند. برای مدیریت سیگنال‌ها، از روش‌هایی مانند فراخوانی `pselect()` یا تکنیک «self-pipe» استفاده می‌شود.

## مزایا
* **کارایی بالا:** حلقهٔ رخداد امکان اجرای وظایف غیرهم‌زمان را بدون نیاز به ایجاد چندین ریسمان مستقل فراهم می‌کند. این امر مصرف حافظه را کاهش داده و کارایی برنامه را افزایش می‌دهد.  
* **پاسخ‌گویی سریع:** در برنامه‌های گرافیکی یا تعاملی، حلقهٔ رخداد به کاربر اجازه می‌دهد در کوتاه‌ترین زمان ممکن پاسخ دریافت کند.  
* **مدیریت منابع:** استفاده بهینه از منابع پردازشی به دلیل نبود سربار همگام‌سازی ریسه‌ها (Threads).

## محدودیت‌ها
* **مسدود شدن حلقه رخداد:** اجرای وظایف سنگین و محاسباتی ممکن است باعث مسدود شدن حلقهٔ رخداد شود و کارایی برنامه را کاهش دهد. در این حالت، استفاده از رایانش هم‌زمان (Parallel Processing) ضروری است.  
* **پیچیدگی مدیریت رخدادها:** در برنامه‌های بزرگ، مدیریت رخدادها و فراخوان‌ها پیچیده شده و ممکن است به کد غیرقابل نگهداری منجر شود.  
* **محدودیت تک‌نخی بودن:** زبان‌هایی مانند جاوااسکریپت به دلیل مدل تک‌ریسه‌ای(Single Thread) خود، محدودیت‌هایی در اجرای وظایف هم‌زمان دارند.

## پیاده‌سازی در زبان‌ها و سیستم‌ها
* **جاوااسکریپت:** حلقهٔ رخداد در جاوااسکریپت برای مدیریت عملیات غیرهم‌زمان مانند AJAX و رویدادهای کاربری استفاده می‌شود.  
* **پایتون:** در پایتون، کتابخانهٔ Asyncio پیاده‌سازی حلقهٔ رخداد را برای مدیریت وظایف غیرهم‌زمان ارائه می‌کند.  
* **نود.جی‌اس:** در نود.جی‌اس، حلقه رخداد با استفاده از کتابخانهٔ Libuv پیاده‌سازی شده و وظایف I/O را به‌طور کارآمد مدیریت می‌کند.  
* **سیستم‌عامل ویندوز:** حلقهٔ پیام‌ها برای مدیریت تعاملات کاربر در ویندوز استفاده می‌شود.  
* **مک‌اواس:** در سیستم‌عامل مک‌اواس، Core Foundation برای مدیریت حلقه رخداد به کار می‌رود.

## منابع
* حلقه رخداد در ویکی‌پدیای انگلیسی  
* حلقه رخداد در جاوااسکریپت - MDN  
* مستندات حلقه رخداد در نود جی‌اس  
* توضیحات حلقه رخداد در پایتون - Real Python

رده:کنترل جریان
رده:رویدادها (رایانش)