آموزش مجموعه رشته ها در همزمانی در پایتون 

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

آموزش مجموعه رشته ها در همزمانی در پایتون

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

پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون

فرض کنید ما مجبور بودیم تعداد زیادی رشته برای کارهای چند رشته خود ایجاد کنیم. این از نظر محاسباتی سنگین خواهد بود زیرا به دلیل رشته های بسیار زیاد ، مشکلات عملکردی زیادی وجود دارد. یک مسئله مهم می تواند محدود کردن توان عملیاتی باشد. ما می توانیم با ایجاد مجموعه ای از رشته ها این مشکل را حل کنیم. استخر نخ ممکن است به عنوان گروهی از نخ های از قبل و بدون کار تعریف شده باشد که آماده کار هستند. ایجاد مجموعه رشته برای ایجاد هر موضوع در هنگام نیاز به تعداد زیادی وظیفه، بر نمونه سازی رشته های جدید ترجیح داده می شود. یک مجموعه رشته می تواند اجرای همزمان تعداد زیادی رشته را به صورت زیر مدیریت کند –

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

ماژول پایتون – Concurrent.futures

کتابخانه استاندارد پایتون شامل ماژول همزمان است. این ماژول برای ارائه رابط سطح بالا برای راه اندازی کارهای ناهمزمان ، در پایتون ۳٫۲ اضافه شد. این یک لایه انتزاعی در بالای ماژول های رشته ای و چند پردازشی پایتون برای ایجاد رابط کاربری برای اجرای وظایف با استفاده از مجموعه رشته یا فرآیند است.

در بخشهای بعدی ما، با کلاسهای مختلف ماژول concurrent.futures آشنا خواهیم شد.

کلاس Executor

Executor یک کلاس انتزاعی از ماژول همزمان پایتون. به طور مستقیم قابل استفاده نیست و ما باید از یکی از زیر کلاس های مشترک زیر استفاده کنیم –

  • ThreadPoolExecutor
  • ProcessPoolExecutor

ThreadPoolExecutor – یک زیر کلاس مشترک

این یکی از زیر کلاس های مشترک کلاس Executor است. زیر کلاس از چند رشته استفاده می کند و ما برای ارسال وظایف یک رشته دریافت می کنیم. این مجموعه وظایف را به رشته های موجود اختصاص می دهد و برای اجرای آنها برنامه ریزی می کند.

چگونه ThreadPoolExecutor ایجاد کنیم؟

با کمک ماژول concurrent.futures و مجری زیر کلاس مشترک آن، به راحتی می توانیم یک رشته از رشته ها ایجاد کنیم. برای این منظور، باید ThreadPoolExecutor با تعداد رشته هایی که می خواهیم در مجموعه رشته ایجاد کنیم. به طور پیش فرض، عدد ۵ است. سپس ما می توانیم یک کار را به مجموعه رشته ارسال کنیم. وقتی وظیفه ای را ()submit می کنیم ، Future را به دست می آوریم. شی Future روشی به نام ()done  دارد که به شما می گوید آیا Future حل شده است یا خیر. با این کار مقداری برای آن شی خاص Future تعیین شده است. هنگامی که یک کار به پایان رسید، Executor مقدار را برای شی future تنظیم می کند.

 

مثال

from concurrent.futures import ThreadPoolExecutor
from time import sleep
def task(message):
   sleep(2)
   return message

def main():
   executor = ThreadPoolExecutor(5)
   future = executor.submit(task, ("Completed"))
   print(future.done())
   sleep(2)
   print(future.done())
   print(future.result())
if __name__ == '__main__':
main()

 

خروجی

False
True
Completed

 

در مثال بالا، ThreadPoolExecutor با ۵ رشته ساخته شده است. سپس کاری که قبل از دادن پیام ۲ ثانیه منتظر بماند، به Executor رشته ارسال می شود. همانطور که از خروجی مشخص است، کار تا ۲ ثانیه تمام نمی شود، بنابراین اولین فراخوانی برای ()False ،done را برمی گرداند. پس از ۲ ثانیه، کار انجام می شود و ما با فراخوانی روش ()result بر روی آن نتیجه آینده را می گیریم.

نصب ThreadPoolExecutor 

راه دیگر برای پیاده سازی ThreadPoolExecutor با کمک مدیر زمینه است. این کار مشابه روشی است که در مثال بالا استفاده شده است. مزیت اصلی استفاده از مدیر زمینه این است که از نظر نحوی خوب به نظر می رسد. نمونه برداری را می توان با کمک کد زیر انجام داد –

with ThreadPoolExecutor(max_workers = 5) as executor

 

مثال

مثال زیر از اسناد پایتون گرفته شده است. در این مثال، اول از همه ماژول همزمان باید وارد شود. سپس تابعی به نام ()load_url  ایجاد می شود که url درخواست شده را بارگیری می کند. سپس این تابع ThreadPoolExecutor را با ۵ رشته موجود در مجموعه رشته را ایجاد می کند. از ThreadPoolExecutor به عنوان مدیر زمینه استفاده شده است. ما می توانیم با فراخوانی روش ()Future ،result را بدست آوریم.

import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
   'http://www.cnn.com/',
   'http://europe.wsj.com/',
   'http://www.bbc.co.uk/',
   'http://some-made-up-domain.com/']

def load_url(url, timeout):
   with urllib.request.urlopen(url, timeout = timeout) as conn:
   return conn.read()

with concurrent.futures.ThreadPoolExecutor(max_workers = 5) as executor:

   future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
   for future in concurrent.futures.as_completed(future_to_url):
   url = future_to_url[future]
   try:
      data = future.result()
   except Exception as exc:
      print('%r generated an exception: %s' % (url, exc))
   else:
      print('%r page is %d bytes' % (url, len(data)))

 

خروجی

در زیر خروجی اسکریپت پایتون فوق وجود دارد –

'http://some-made-up-domain.com/' generated an exception: <urlopen error [Errno 11004] getaddrinfo failed>
'http://www.foxnews.com/' page is 229313 bytes
'http://www.cnn.com/' page is 168933 bytes
'http://www.bbc.co.uk/' page is 283893 bytes
'http://europe.wsj.com/' page is 938109 bytes

 

استفاده از تابع ()Executor.map
از تابع ()map پایتون به طور گسترده ای در تعدادی از کارها استفاده می شود. یکی از این وظایف استفاده از یک تابع خاص برای هر عنصر قابل تکرار است. به همین ترتیب، می توانیم تمام عناصر تکرار کننده را به یک تابع ترسیم کرده و آنها را به عنوان مشاغل مستقل به ThreadPoolExecutor ارسال کنیم. برای درک چگونگی تابع، به مثال زیر اسکریپت پایتون توجه کنید.

مثال

در این مثال زیر، از تابع ()map برای اعمال تابع ()square به هر مقداری از آرایه مقادیر استفاده شده است.

from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import as_completed
values = [2,3,4,5]
def square(n):
   return n * n
def main():
   with ThreadPoolExecutor(max_workers = 3) as executor:
      results = executor.map(square, values)
for result in results:
      print(result)
if __name__ == '__main__':
   main()

 

خروجی

در زیر خروجی اسکریپت پایتون فوق وجود دارد –

۴
۹
۱۶
۲۵

 

منبع.

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

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

دیدگاه شما

بدون دیدگاه