درک بهتر event loop

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1403/05/11
  • تعداد بازدید: 91

در پایتون، ماژول asyncio ابزارهای مختلفی برای کار با حلقه‌های رویداد (event loops) فراهم می‌کند. asyncio.run یکی از ساده‌ترین و رایج‌ترین راه‌ها برای ایجاد و اجرای یک حلقه رویداد است. در اینجا به توضیحات بیشتری در مورد asyncio.run و انواع حلقه‌های رویداد و تفاوت‌های آن‌ها خواهیم پرداخت.

انواع Event Loop در asyncio

در پایتون، چند نوع حلقه رویداد وجود دارد که می‌توانید از آن‌ها استفاده کنید:

  1. Default Event Loop:

    • این نوع حلقه رویداد به صورت پیش‌فرض در اکثر سیستم‌عامل‌ها استفاده می‌شود و با asyncio.run() به طور خودکار ایجاد می‌شود. این حلقه بر روی بسیاری از سیستم‌عامل‌ها بهینه‌سازی شده و عملکرد مناسبی دارد.
  2. SelectorEventLoop:

    • این نوع حلقه رویداد برای سیستم‌عامل‌های یونیکس (مانند لینوکس و مک) استفاده می‌شود و از ماژول‌های انتخاب (selectors) برای مدیریت ورودی/خروجی استفاده می‌کند. این نوع حلقه رویداد می‌تواند برای بیشتر برنامه‌های غیرهمزمان مناسب باشد.
  3. ProactorEventLoop:

    • این حلقه رویداد مخصوص ویندوز است و از I/O Completion Ports (IOCP) برای مدیریت عملیات ورودی/خروجی استفاده می‌کند. ProactorEventLoop برای برخی از برنامه‌های خاص که نیاز به کارایی بالاتر در Windows دارند، بهینه‌سازی شده است.

در پایتون و به‌ویژه در ماژول asyncio، چندین مدل و روش مختلف برای ساخت و مدیریت یک حلقه رویداد (event loop) وجود دارد. در ادامه به توضیح این روش‌ها می‌پردازیم:

1. asyncio.get_event_loop()

این روش به شما اجازه می‌دهد تا حلقه رویداد فعلی را بگیرید. اگر هیچ حلقه‌ای وجود نداشته باشد، یک حلقه جدید ایجاد می‌شود. این روش در سناریوهایی که می‌خواهید حلقه فعلی را بازیابی کنید، مفید است.

import asyncio

async def main():
    print("Hello, World!")

# گرفتن حلقه رویداد فعلی
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

2. asyncio.new_event_loop()

با استفاده از asyncio.new_event_loop() می‌توانید یک حلقه رویداد جدید ایجاد کنید. این روش زمانی که نیاز به ایجاد چندین حلقه رویداد مستقل دارید، بسیار مفید است.

import asyncio

async def main():
    print("Hello from a new event loop!")

# ایجاد یک حلقه جدید
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)  # تنظیم حلقه جدید به عنوان حلقه فعلی
loop.run_until_complete(main())
loop.close()  # بستن حلقه بعد از اتمام

3. asyncio.set_event_loop(loop)

این تابع به شما اجازه می‌دهد تا حلقه‌ای را به عنوان حلقه رویداد فعلی تنظیم کنید. این روش به‌ویژه زمانی مفید است که می‌خواهید از حلقه‌ای که خودتان ایجاد کرده‌اید استفاده کنید.

import asyncio

async def main():
    print("Hello with a custom event loop!")

# ایجاد یک حلقه جدید
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)  # تنظیم حلقه جدید به عنوان حلقه فعلی
loop.run_until_complete(main())
loop.close()  # بستن حلقه بعد از اتمام

4. استفاده از asyncio.run_until_complete به صورت مستقیم

این روش به شما اجازه می‌دهد که از حلقه‌ای که خودتان ایجاد کرده‌اید، بدون نیاز به بستن آن بعد از اتمام coroutine استفاده کنید.

import asyncio

async def main():
    print("Running with run_until_complete")

# ایجاد حلقه جدید
loop = asyncio.new_event_loop()
try:
    loop.run_until_complete(main())
finally:
    loop.close()  # بستن حلقه در پایان

5. استفاده از asyncio.run (به عنوان یک رویکرد متداول)

این روش برای راه‌اندازی و اجرای یک coroutine به سادگی و بدون نیاز به مدیریت مستقیم حلقه رویداد استفاده می‌شود. همان‌طور که در توضیحات قبلی ذکر شد، asyncio.run برای اجرای یک coroutine به‌طور خودکار یک حلقه رویداد جدید ایجاد می‌کند و پس از اتمام آن، حلقه را می‌بندد.

6. استفاده از loop.run_forever()

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

import asyncio

async def periodic_task():
    while True:
        print("Task is running...")
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()
try:
    loop.create_task(periodic_task())  # ایجاد یک task جدید
    loop.run_forever()  # اجرای حلقه به صورت دائم
finally:
    loop.close()  # بستن حلقه در صورت خروج

در کل، چندین مدل و روش برای ساخت و مدیریت حلقه‌های رویداد در پایتون وجود دارد. انتخاب مناسب‌ترین روش بستگی به نیازهای خاص برنامه شما، نحوه استفاده از coroutine‌ها و میزان کنترل مورد نیاز بر روی حلقه رویداد دارد. روش‌های مختلف به شما این امکان را می‌دهند که حلقه‌های رویداد را به بهترین نحو مدیریت کنید.


ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است می توانید اولین نفر باشید