آموزش برنامه نویسی مبتنی بر رویداد در همزمانی در پایتون

3 سال پیش

آموزش برنامه نویسی مبتنی بر رویداد در همزمانی در پایتون

 

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش برنامه نویسی مبتنی بر رویداد در همزمانی در پایتون خواهیم پرداخت.

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

Driven

 

ماژول پایتون – Asyncio

ماژول Asyncio در پایتون ۳٫۴ اضافه شد و این زیرساخت را برای نوشتن کد همزمان تک رشته ای با استفاده از روال های مشترک فراهم می کند. در زیر مفاهیم مختلف استفاده شده توسط ماژول Asyncio –

پیشنهاد ویژه : پکیج آموزش پایتون مختص بازار کار

 

حلقه رویداد

Event-loop یک تابع برای رسیدگی به همه رویدادها در یک کد محاسباتی است. این برنامه در طول اجرای کل برنامه عمل می کند و ورود و اجرای رویدادها را ردیابی می کند. ماژول Asyncio اجازه می دهد تا یک حلقه رویداد واحد در هر فرآیند انجام شود. موارد زیر چند روش ارائه شده توسط ماژول Asyncio برای مدیریت حلقه رویداد است –

 

()loop = get_event_loop  – این روش حلقه رویداد را برای زمینه فعلی فراهم می کند.

loop.call_later(time_delay,callback,argument) – این روش ترتیب کال بک مجددی را می دهد که قرار است بعد از زمان_دقت ثانیه فراخوانی شود.

loop.call_soon(callback,argument) – این روش ترتیب کال بک مجددی را می دهد که قرار است در اسرع وقت فراخوانی شود. پس از بازگشت ()call_soon و هنگامی که کنترل به حلقه رویداد بازگشت  فراخوانی می شود.

()loop.time  – این روش برای بازگرداندن زمان فعلی با توجه به ساعت داخلی حلقه رویداد استفاده می شود.

()asyncio.set_event_loop  – این روش حلقه رویداد را برای زمینه فعلی به حلقه تنظیم می کند.

()asyncio.new_event_loop  – این روش یک شی حلقه رویداد جدید را ایجاد و بازگرداند.

()loop.run_forever – این روش تا فراخوانی متد ()stop  اجرا خواهد شد.

 

مثال

مثال زیر از حلقه رویداد با استفاده از روش ()get_event_loop  به چاپ hello world کمک می کند. این مثال از اسناد رسمی پایتون گرفته شده است.

import asyncio

def hello_world(loop):
   print('Hello World')
   loop.stop()

loop = asyncio.get_event_loop()

loop.call_soon(hello_world, loop)

loop.run_forever()
loop.close()

 

خروجی

Hello World

 

Futures

این سازگار با کلاس همزمان است. Future.Future که نشان دهنده محاسباتی است که انجام نشده است. تفاوت های زیر بین asyncio.utur. آینده و همزمان وجود دارد. آینده –

 

  • () resultو ()exception  استدلال برای اتمام وقت ندارند و وقتی آینده هنوز انجام نشده استثنا ایجاد می کنند.
  • تماس های تلفنی ثبت شده با ()add_done_callback  همیشه از طریق حلقه رویداد call_soon () فراخوانی می شوند.
  • asyncio.futures. کلاس آینده با توابع ()wait  و ()as_completed در بسته همزمان.futures سازگار نیست.

 

مثال

مثال زیر مثالی است که به شما کمک می کند نحوه استفاده از کلاس asyncio.futures.future را بفهمید.

 

import asyncio

async def Myoperation(future):
   await asyncio.sleep(2)
   future.set_result('Future Completed')

loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(Myoperation(future))
try:
   loop.run_until_complete(future)
   print(future.result())
finally:
   loop.close()

 

خروجی

Future Completed

 

coroutines

مفهوم coroutines در Asyncio مشابه مفهوم استاندارد رشته در زیر ماژول threading است. این تعمیم مفهوم زیرروال است. یک coroutines می تواند در حین اجرا به حالت تعلیق درآید تا منتظر پردازش خارجی باشد و از نقطه ای که هنگام انجام پردازش خارجی متوقف شده بود بازگردد. دو روش زیر به ما در اجرای انواع coroutines کمک می کند –

 

تابع ()def async 

این روشی برای پیاده سازی انواع کوتولین در زیر ماژول Asyncio است. در زیر یک اسکریپت پایتون برای همان آورده شده است –

import asyncio

async def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

 

خروجی

First Coroutine

 

 دکوراتور asyncio.coroutine@

روش دیگر برای اجرای coroutines استفاده از ژنراتورهای دارای دکوراتور  asyncio.coroutine@ است. در زیر یک اسکریپت پایتون برای همان آورده شده است –

mport asyncio

@asyncio.coroutine
def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

 

خروجی

First Coroutine

 

Tasks

این زیر کلاس ماژول Asyncio وظیفه اجرای coroutines ها را به صورت موازی در یک حلقه رویداد دارد. پیروی از اسکریپت پایتون نمونه ای از پردازش موازی برخی کارها است.

import asyncio
import time
async def Task_ex(n):
   time.sleep(1)
   print("Processing {}".format(n))
async def Generator_task():
   for i in range(10):
      asyncio.ensure_future(Task_ex(i))
   int("Tasks Completed")
   asyncio.sleep(2)

loop = asyncio.get_event_loop()
loop.run_until_complete(Generator_task())
loop.close()

 

خروجی

Tasks Completed
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9

 

حمل و نقل

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

در زیر انواع متفاوتی از حمل و نقل به ارث رسیده از BaseTransport وجود دارد –

  • ReadTransport – این یک رابط برای حمل و نقل فقط برای خواندن است.
  • WritTransport – این یک رابط برای حمل و نقل فقط برای نوشتن است.
  • DatagramTransport – این یک رابط برای ارسال داده است.
  • BaseSubprocessTransport – مشابه کلاس BaseTransport.

موارد زیر پنج روش مشخص از کلاس BaseTransport است که متعاقباً در چهار نوع حمل و نقل گذرا هستند –

  • ()close  – حمل و نقل را می بندد.
  • ()is_closing  – اگر حمل و نقل بسته شود یا از قبل بسته شده باشد این روش درست برمی گردد.
  • ()get_extra_info (نام ، پیش فرض = هیچ) – این به ما اطلاعات بیشتری در مورد حمل و نقل می دهد.
  • ()get_protocol  – این روش پروتکل فعلی را برمی گرداند.

پروتکل ها

ماژول Asyncio کلاس های پایه ای را ارائه می دهد که می توانید برای اجرای پروتکل های شبکه خود زیر کلاس بگذارید. از آن کلاسها همراه با حمل و نقل استفاده می شود. پروتکل داده های دریافتی را تجزیه می کند و خواستار نوشتن داده های خروجی است ، در حالی که حمل و نقل مسئول I / O و بافر واقعی است. در زیر سه کلاس پروتکل وجود دارد –

  • Protocol – این کلاس پایه برای اجرای پروتکل های جریان برای استفاده با حمل و نقل TCP و SSL است.
  • DatagramProtocol – این کلاس پایه برای اجرای پروتکل های دیتاگرام برای استفاده با حمل و نقل UDP است.
  • SubprocessProtocol – این کلاس پایه برای اجرای پروتکل های ارتباطی با فرآیندهای کودک از طریق مجموعه ای از لوله های یک جهته است.

منبع.

لیست جلسات قبل آموزش همزبانی در پایتون

  1. آموزش همزمانی در برنامه نویسی پایتون
  2. آموزش همزمانی در برنامه نویسی پایتون _ مقدمه
  3. آموزش معماری سیستم و حافظه در برنامه نویسی پایتون
  4.  آموزش رشته ها در همزمانی پایتون 
  5. آموزش پیاده سازی رشته در همزمانی پایتون
  6. آموزش همگام سازی رشته ها در همزمانی پایتون
  7. آموزش ارتباط رشته ها در همزمانی پایتون
  8. آموزش تست برنامه های رشته در همزمانی پایتون
  9. اشکال زدایی از برنامه های رشته در همزمانی پایتون
  10. آموزش بنچ مارکینگ و پروفایل در همزمانی پایتون
  11. آموزش مجموعه رشته ها در همزمانی در پایتون 
  12.  آموزش مجموعه مراحل در همزمانی در پایتون
  13. آموزش پردازش چندگانه در همزمانی در پایتون 
  14. آموزش ارتباط بین پردازشی در همربانی در پایتون
0
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه