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

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

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

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

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

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

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

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

 

کلاس Executor

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

  • ThreadPoolExecutor
    ProcessPoolExecutor

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

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

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

با کمک ماژول concurrent.futures و مجری زیر کلاس مشترک آن، می توانیم به راحتی مجموعه فرآیند ایجاد کنیم. برای این منظور، ما باید یک ProcessPoolExecutor با تعداد پردازش هایی که می خواهیم در مجموعه فرایند ایجاد کنیم. به طور پیش فرض ، عدد ۵ است. این کار با ارسال یک کار به مجموعه فرآیند دنبال می شود.

مثال

ما اکنون همان مثالی را که در هنگام ایجاد thread pool استفاده کردیم ، در نظر خواهیم گرفت، تنها تفاوت در این است که اکنون ما به جای ThreadPoolExecutor از ProcessPoolExecutor استفاده خواهیم کرد.

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

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

 

خروجی

False
False
Completed

 

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

Instantizing ProcessPoolExecutor – مدیر زمینه

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

with ProcessPoolExecutor(max_workers = 5) as executor

 

مثال

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

import concurrent.futures
from concurrent.futures import ProcessPoolExecutor
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()

def main():
   with concurrent.futures.ProcessPoolExecutor(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)))

if __name__ == '__main__':
   main()

خروجی

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

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

 

استفاده از تابع ()Executor.map 

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

مثال

ما همان مثالی را که در هنگام ایجاد thread thread با استفاده از تابع () Executor.map استفاده کردیم ، در نظر خواهیم گرفت. در مثالی که در زیر آمده است، از تابع نقشه برای اعمال تابع ()square به هر مقداری از آرایه مقادیر استفاده می شود.

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

 

خروجی

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

۴
۹
۱۶
۲۵

 

چه زمانی از ProcessPoolExecutor و ThreadPoolExecutor استفاده کنیم؟

اکنون که در مورد هر دو کلاس Executor – ThreadPoolExecutor و ProcessPoolExecutor – مطالعه کردیم ، باید بدانیم که چه زمان از کدام مجری استفاده کنیم. ما باید ProcessPoolExecutor را در صورت بارهای متصل به CPU و ThreadPoolExecutor را در صورت حجم کاری I / O را انتخاب کنیم.

اگر ما از ProcessPoolExecutor استفاده می کنیم ، دیگر نیازی به نگرانی در مورد GIL نداریم زیرا از چند پردازش استفاده می کند. علاوه بر این، زمان مقایسه با ThreadPoolExecution کمتر خواهد بود. برای درک این موضوع، مثال زیر را برای اسکریپت پایتون در نظر بگیرید.

مثال

import time
import concurrent.futures

value = [8000000, 7000000]

def counting(n):
   start = time.time()
   while n > 0:
      n -= 1
   return time.time() - start

def main():
   start = time.time()
   with concurrent.futures.ProcessPoolExecutor() as executor:
      for number, time_taken in zip(value, executor.map(counting, value)):
         print('Start: {} Time taken: {}'.format(number, time_taken))
   print('Total time taken: {}'.format(time.time() - start))

if __name__ == '__main__':
main()

 

خروجی 

Start: 8000000 Time taken: 1.5509998798370361
Start: 7000000 Time taken: 1.3259999752044678
Total time taken: 2.0840001106262207

Example- Python script with ThreadPoolExecutor:
import time
import concurrent.futures

value = [8000000, 7000000]

def counting(n):
   start = time.time()
   while n > 0:
      n -= 1
   return time.time() - start

def main():
   start = time.time()
   with concurrent.futures.ThreadPoolExecutor() as executor:
      for number, time_taken in zip(value, executor.map(counting, value)):
         print('Start: {} Time taken: {}'.format(number, time_taken))
      print('Total time taken: {}'.format(time.time() - start))

if __name__ == '__main__':
main()

 

خروجی 

Start: 8000000 Time taken: 3.8420000076293945
Start: 7000000 Time taken: 3.6010000705718994
Total time taken: 3.8480000495910645

 

از خروجی هر دو برنامه فوق، می توان تفاوت زمان اجرا را هنگام استفاده از ProcessPoolExecutor و ThreadPoolExecutor مشاهده کرد.

 

منبع.

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

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

دیدگاه شما

بدون دیدگاه