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

3 سال پیش

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

 

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

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

ارتباط بین پردازشی به معنای تبادل داده بین فرآیند است. تبادل داده ها بین فرایندها برای توسعه برنامه موازی ضروری است. نمودار زیر مکانیسم های مختلف ارتباطی برای همگام سازی بین چندین فرایند را نشان می دهد –

Intercommunication

مکانیسم های مختلف ارتباطی

در این بخش، ما با مکانیسم های مختلف ارتباطی آشنا خواهیم شد. سازوکارها در زیر شرح داده شده است –

صف

صف را می توان با برنامه های چند فرآیند استفاده کرد. کلاس صف ماژول چند پردازشی مشابه کلاس Queue.Queue است. از این رو می توان از همان API استفاده کرد. پردازش چندگانه. Queue به ما یک موضوع و پردازش ایمن FIFO (اولین در اولین خروجی) مکانیسم ارتباط بین فرآیندها را می دهد.

مثال

در زیر یک مثال ساده گرفته شده است که از اسناد رسمی پایتون درباره چند پردازش برای درک مفهوم کلاس صف پردازش چندگانه گرفته شده است.

from multiprocessing import Process, Queue
import queue
import random
def f(q):
   q.put([42, None, 'hello'])
def main():
   q = Queue()
   p = Process(target = f, args = (q,))
   p.start()
   print (q.get())
if __name__ == '__main__':
   main()

 

خروجی

[۴۲, None, 'hello']

 

Pipe

این یک ساختار داده است ، که برای برقراری ارتباط بین فرآیندها در برنامه های چند پردازشی استفاده می شود. تابع Pipe (جفت) یک جفت اشیا  اتصال را که توسط یک لوله متصل شده اند برمی گرداند که به طور پیش فرض دو طرفه است. به روش زیر کار می کند –

این یک جفت اشیا  اتصال است که دو انتهای لوله را نشان می دهد.

هر شی دو متد دارد: ()send و ()recv، برای برقراری ارتباط بین پردازش ها.

مثال

در زیر یک مثال ساده گرفته شده است که از اسناد رسمی پایتون در مورد چند پردازش برای درک مفهوم تابع ()Pipe در زمینه پردازش چندگانه گرفته شده است.

from multiprocessing import Process, Pipe

def f(conn):
   conn.send([42, None, 'hello'])
   conn.close()

if __name__ == '__main__':
   parent_conn, child_conn = Pipe()
   p = Process(target = f, args = (child_conn,))
   p.start()
   print (parent_conn.recv())
   p.join()

 

خروجی

[۴۲, None, 'hello']

 

manager

manager یک کلاس از ماژول چند پردازشی است که راهی برای هماهنگی اطلاعات مشترک بین همه کاربران خود فراهم می کند. یک شی manager فرآیند سرور را کنترل می کند ، که اشیا  مشترک را مدیریت می کند و به سایر فرآیندها اجازه می دهد تا آنها را دستکاری کنند. به عبارت دیگر، manager راهی برای ایجاد داده هایی فراهم می کنند که می تواند بین فرآیندهای مختلف به اشتراک گذاشته شود. در زیر خصوصیات مختلف شی manager آمده است –

  • ویژگی اصلی manager کنترل فرآیند سرور است که اشیا  مشترک را مدیریت می کند.
  • ویژگی مهم دیگر به روزرسانی همه اشیا  به اشتراک گذاشته شده در هنگام اصلاح فرآیند است.

مثال

در زیر مثالی آورده شده است که از شی مدیریت برای ایجاد یک رکورد لیست در فرآیند سرور و سپس افزودن رکورد جدید در آن لیست استفاده می کند.

import multiprocessing

def print_records(records):
   for record in records:
      print("Name: {0}\nScore: {1}\n".format(record[0], record[1]))

def insert_record(record, records):
   records.append(record)
      print("A New record is added\n")

if __name__ == '__main__':
   with multiprocessing.Manager() as manager:

      records = manager.list([('Computers', 1), ('Histoty', 5), ('Hindi',9)])
      new_record = ('English', 3)

      p1 = multiprocessing.Process(target = insert_record, args = (new_record, records))
      p2 = multiprocessing.Process(target = print_records, args = (records,))
      p1.start()
      p1.join()
      p2.start()
      p2.join()

 

خروجی

A New record is added

Name: Computers
Score: 1

Name: Histoty
Score: 5

Name: Hindi
Score: 9

Name: English
Score: 3

 

مفهوم فضاهای نام در manager

کلاس Manager با مفهوم فضاهای نام همراه است ، که یک روش سریع برای به اشتراک گذاری چندین ویژگی در چندین فرآیند است. فضاهای نام هیچ روش عمومی ندارند ، که بتوان آنها را فراخوانی کرد ، اما ویژگی های قابل نوشتاری دارند.

مثال

مثال اسکریپت پایتون زیر به ما کمک می کند تا از فضاهای نامی برای به اشتراک گذاری داده ها در فرآیند اصلی و فرآیند کودک استفاده کنیم –

import multiprocessing

def Mng_NaSp(using_ns):

   using_ns.x +=5
   using_ns.y *= 10

if __name__ == '__main__':
   manager = multiprocessing.Manager()
   using_ns = manager.Namespace()
   using_ns.x = 1
   using_ns.y = 1

   print ('before', using_ns)
   p = multiprocessing.Process(target = Mng_NaSp, args = (using_ns,))
   p.start()
   p.join()
   print ('after', using_ns)

 

خروجی

before Namespace(x = 1, y = 1)
after Namespace(x = 6, y = 10)

 

آرایه و مقدار Ctypes

ماژول چند پردازشی اشیا Array و Value را برای ذخیره سازی داده ها در نقشه حافظه مشترک فراهم می کند. Array یک آرایه ctypes است که از حافظه مشترک تخصیص داده می شود و Value یک نوع ctypes است که از حافظه مشترک تخصیص یافته است.

 

مثال

پیروی از اسکریپت پایتون مثالی است که از اسناد پایتون برای استفاده از Ctypes Array و Value برای به اشتراک گذاری برخی داده ها بین پردازش ها گرفته شده است.

def f(n, a):
   n.value = 3.1415927
   for i in range(len(a)):
   a[i] = -a[i]

if __name__ == '__main__':
   num = Value('d', 0.0)
   arr = Array('i', range(10))

   p = Process(target = f, args = (num, arr))
   p.start()
   p.join()
   print (num.value)
   print (arr[:])

 

خروجی

۳٫۱۴۱۵۹۲۷
[۰, -۱, -۲, -۳, -۴, -۵, -۶, -۷, -۸, -۹]

 

برقراری ارتباط پردازش های متوالی (CSP)

CSP برای نشان دادن تعامل سیستم ها با سایر سیستم های دارای مدل های همزمان استفاده می شود. CSP چارچوبی برای نوشتن همزمان یا برنامه از طریق ارسال پیام است و از این رو برای توصیف همزمانی مثر است.

کتابخانه پایتون – PyCSP

برای پیاده سازی اولیه های اصلی موجود در CSP ، پایتون کتابخانه ای به نام PyCSP دارد. این امر اجرای آن را بسیار کوتاه و قابل خواندن نگه می دارد تا به راحتی درک شود. در زیر شبکه فرآیند اساسی PyCSP آورده شده است –

 

PyCSP

در شبکه فرآیند PyCSP فوق، دو فرآیند وجود دارد – Process1 و Process 2. این پردازش ها با ارسال پیام از دو کانال – کانال ۱ و کانال ۲ ارتباط برقرار می کنند.

نصب PyCSP

با کمک دستور زیر می توان کتابخانه Python PyCSP را نصب کرد –

pip install PyCSP

 

مثال

پیروی از اسکریپت پایتون یک مثال ساده برای اجرای دو فرآیند به موازات یکدیگر است. این کار با کمک PyCSP python libabary انجام می شود –

from pycsp.parallel import *
import time
@process
def P1():
   time.sleep(1)
   print('P1 exiting')
@process
def P2():
   time.sleep(1)
   print('P2 exiting')
def main():
   Parallel(P1(), P2())
   print('Terminating')
if __name__ == '__main__':
   main()

 

در اسکریپت فوق دو عملکرد P1 و P2 ایجاد شده و سپس برای تبدیل آنها به پردازش باprocess تزئین شده است.

خروجی

P2 exiting
P1 exiting
Terminating

 

منبع.

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

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

دیدگاه شما

بدون دیدگاه