آموزش ارتباط بین پردازشی در همربانی در پایتون
آموزش ارتباط بین پردازشی در همربانی در پایتون
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش ارتباط بین پردازشی در همربانی در پایتون خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون
ارتباط بین پردازشی به معنای تبادل داده بین فرآیند است. تبادل داده ها بین فرایندها برای توسعه برنامه موازی ضروری است. نمودار زیر مکانیسم های مختلف ارتباطی برای همگام سازی بین چندین فرایند را نشان می دهد –
مکانیسم های مختلف ارتباطی
در این بخش، ما با مکانیسم های مختلف ارتباطی آشنا خواهیم شد. سازوکارها در زیر شرح داده شده است –
صف
صف را می توان با برنامه های چند فرآیند استفاده کرد. کلاس صف ماژول چند پردازشی مشابه کلاس Queue.Queue است. از این رو می توان از همان API استفاده کرد. پردازش چندگانه. Queue به ما یک موضوع و پردازش ایمن FIFO (اولین در اولین خروجی) مکانیسم ارتباط بین فرآیندها را می دهد.
مثال
در زیر یک مثال ساده گرفته شده است که از اسناد رسمی پایتون درباره چند پردازش برای درک مفهوم کلاس صف پردازش چندگانه گرفته شده است.
1 2 3 4 5 6 7 8 9 10 11 12 |
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() |
خروجی
1 |
[42, None, 'hello'] |
Pipe
این یک ساختار داده است ، که برای برقراری ارتباط بین فرآیندها در برنامه های چند پردازشی استفاده می شود. تابع Pipe (جفت) یک جفت اشیا اتصال را که توسط یک لوله متصل شده اند برمی گرداند که به طور پیش فرض دو طرفه است. به روش زیر کار می کند –
این یک جفت اشیا اتصال است که دو انتهای لوله را نشان می دهد.
هر شی دو متد دارد: ()send و ()recv، برای برقراری ارتباط بین پردازش ها.
مثال
در زیر یک مثال ساده گرفته شده است که از اسناد رسمی پایتون در مورد چند پردازش برای درک مفهوم تابع ()Pipe در زمینه پردازش چندگانه گرفته شده است.
1 2 3 4 5 6 7 8 9 10 11 12 |
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() |
خروجی
1 |
[42, None, 'hello'] |
manager
manager یک کلاس از ماژول چند پردازشی است که راهی برای هماهنگی اطلاعات مشترک بین همه کاربران خود فراهم می کند. یک شی manager فرآیند سرور را کنترل می کند ، که اشیا مشترک را مدیریت می کند و به سایر فرآیندها اجازه می دهد تا آنها را دستکاری کنند. به عبارت دیگر، manager راهی برای ایجاد داده هایی فراهم می کنند که می تواند بین فرآیندهای مختلف به اشتراک گذاشته شود. در زیر خصوصیات مختلف شی manager آمده است –
- ویژگی اصلی manager کنترل فرآیند سرور است که اشیا مشترک را مدیریت می کند.
- ویژگی مهم دیگر به روزرسانی همه اشیا به اشتراک گذاشته شده در هنگام اصلاح فرآیند است.
مثال
در زیر مثالی آورده شده است که از شی مدیریت برای ایجاد یک رکورد لیست در فرآیند سرور و سپس افزودن رکورد جدید در آن لیست استفاده می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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() |
خروجی
1 2 3 4 5 6 7 8 9 10 11 12 13 |
A New record is added Name: Computers Score: 1 Name: Histoty Score: 5 Name: Hindi Score: 9 Name: English Score: 3 |
مفهوم فضاهای نام در manager
کلاس Manager با مفهوم فضاهای نام همراه است ، که یک روش سریع برای به اشتراک گذاری چندین ویژگی در چندین فرآیند است. فضاهای نام هیچ روش عمومی ندارند ، که بتوان آنها را فراخوانی کرد ، اما ویژگی های قابل نوشتاری دارند.
مثال
مثال اسکریپت پایتون زیر به ما کمک می کند تا از فضاهای نامی برای به اشتراک گذاری داده ها در فرآیند اصلی و فرآیند کودک استفاده کنیم –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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) |
خروجی
1 2 |
before Namespace(x = 1, y = 1) after Namespace(x = 6, y = 10) |
آرایه و مقدار Ctypes
ماژول چند پردازشی اشیا Array و Value را برای ذخیره سازی داده ها در نقشه حافظه مشترک فراهم می کند. Array یک آرایه ctypes است که از حافظه مشترک تخصیص داده می شود و Value یک نوع ctypes است که از حافظه مشترک تخصیص یافته است.
مثال
پیروی از اسکریپت پایتون مثالی است که از اسناد پایتون برای استفاده از Ctypes Array و Value برای به اشتراک گذاری برخی داده ها بین پردازش ها گرفته شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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[:]) |
خروجی
1 2 |
3.1415927 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] |
برقراری ارتباط پردازش های متوالی (CSP)
CSP برای نشان دادن تعامل سیستم ها با سایر سیستم های دارای مدل های همزمان استفاده می شود. CSP چارچوبی برای نوشتن همزمان یا برنامه از طریق ارسال پیام است و از این رو برای توصیف همزمانی مثر است.
کتابخانه پایتون – PyCSP
برای پیاده سازی اولیه های اصلی موجود در CSP ، پایتون کتابخانه ای به نام PyCSP دارد. این امر اجرای آن را بسیار کوتاه و قابل خواندن نگه می دارد تا به راحتی درک شود. در زیر شبکه فرآیند اساسی PyCSP آورده شده است –
در شبکه فرآیند PyCSP فوق، دو فرآیند وجود دارد – Process1 و Process 2. این پردازش ها با ارسال پیام از دو کانال – کانال 1 و کانال 2 ارتباط برقرار می کنند.
نصب PyCSP
با کمک دستور زیر می توان کتابخانه Python PyCSP را نصب کرد –
1 |
pip install PyCSP |
مثال
پیروی از اسکریپت پایتون یک مثال ساده برای اجرای دو فرآیند به موازات یکدیگر است. این کار با کمک PyCSP python libabary انجام می شود –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 تزئین شده است.
خروجی
1 2 3 |
P2 exiting P1 exiting Terminating |
لیست جلسات قبل آموزش همزبانی در پایتون
- آموزش همزمانی در برنامه نویسی پایتون
- آموزش همزمانی در برنامه نویسی پایتون _ مقدمه
- آموزش معماری سیستم و حافظه در برنامه نویسی پایتون
- آموزش رشته ها در همزمانی پایتون
- آموزش پیاده سازی رشته در همزمانی پایتون
- آموزش همگام سازی رشته ها در همزمانی پایتون
- آموزش ارتباط رشته ها در همزمانی پایتون
- آموزش تست برنامه های رشته در همزمانی پایتون
- اشکال زدایی از برنامه های رشته در همزمانی پایتون
- آموزش بنچ مارکینگ و پروفایل در همزمانی پایتون
- آموزش مجموعه رشته ها در همزمانی در پایتون
- آموزش مجموعه مراحل در همزمانی در پایتون
- آموزش پردازش چندگانه در همزمانی در پایتون
دیدگاه شما