Multi threading

از PyLearn.com

پرش به: ناوبری, جستجو

موضوع هایی که می خواهیم در موردشان بحث کنیم:

  • 1. مقدمه
  • 2. نخها و پروسس ها
  • 3. نخها و پیتون
  • 4. ماژول thread
  • 5. ماژول threading

در این موضوع , ما می خوایم راههایی که شما می توانید اجرای موازی و همزمان رو در کد خودتون استفاده کنید و چگونکی استفاده ازبرنامه نویسی Multithread (MT) و ایجاد آن در پیتون. این مقاله مثل تمام مقالات من کامل نیست و من فقط مطالبی که به نظر مهم هستند و به کمکتون می یاد را توضیح می دهم.

  • مقدمه:

قبل از هر چیز باید بدانید که برنامه نویسی چند نخی (Multithread) یکی از قابلیت هایی است که مستقیما به سیستم عامل مربوط می شود یعنی سیستم عامل شما باید از این شیوه پشتیبانی کند (سیستم عامل ویندوز این قابلیت را دارد). هر وقت برنامه ای شروع به اجرا می کند ویندوز یک ( نخ) به ان اختصاص می دهد این Thread در واقع رابط بین برنامه و CPU است . همونطور که می دانید CPU برای اینکه بتواند چند وظیفه را بصورت هم زمان انجام دهد , به هر Thread یک زمان مشخص اختصاص می دهد (با توجه به اولویت Thread). مثلا اگر ما دو Thread در حال اجرا داشته باشیم CPU یک زمان خاصی را به Thread اولی اختصاص می دهد تا کارش را انجام دهد پس از اتمام زمان نوبت به Thread بعدی می رسد و به همین ترتیب...

  • نخ ها و پروسس ها:
  • پروسس چیست:

برنامه های کامپیوتر صرفا اجرا پذیر هستند, باینری (یا طور دیگر ), این برنامه ها روی دیسک قرار دارند. اینها نمی توانند کاری انجام بدهند(به اصطلاح مرده هستند) تا زمانی که داخل حافظه بارگذاری شوند و از سیستم عامل درخواست کنند. پروسس یک برنامه در حال اجرا است. هر پروسس یک ادرس فضا , حافظه و یک پشته داده دارد. سیستم عامل کنترل کننده تمام پروسس های در حال اجرا بر روی سیستم است, و زمان رو میان انها به طور خوب تقسیم می کند. پروسس ها می توانند چند شاخه بشوند یا یک پروسس جدید برای انجام دیگر کارها ایجاد کنند, هر یک از این پروسس های جدید حافظه و پشته داده و... خودشان را دارند ولی نمی توانند به طور عمومی از اطلاعات سهمی داشته باشند مگر اینکه از IPC ها استفاده کنند.

  • نخ چیست:

Thread ها یا نخ ها به قطعه کدهایی گفته می شود که به صورت موازی و همزمان با هم اجرا می شوند و به شما این امکان را می دهند برنامه هایی را طراحی و پیاده سازی کنید که می توانند چندین کار را با هم انجام دهند به طور مثال : جستجوی چند فایل یا گرفتن اطلاعات از طریق شبکه و ذخیره انها در دیسک. البته اصولا نخ ها به صورت همزمان اجرا نمی شوند بلکه CPU براساس تنظیم زمان خود یک زمان غیر قابل درک برای انسان را در نظر می گیرد سپس در این مدت زمان یک کار را انجام داده و پس از اتمام این زمان به سراغ کار بعدی می رود به اصطلاح در کارهای خود سوییچ می کند. به این مدت زمان کوتاه اصطلاحا Time Slice یا پرش زمان می گویند.

  • نخ ها و پیتون:
  • دسترسی به نخها در پیتون:

پیتون از برنامه نویسی چندنخی پشتیبانی می کند. پس باید سیستم عامل در حال اچرا ان را پشتیبانی کند بیشتر ورژنهای Unix , Solaris , Linux و Windows از این قابلیت پشتیبانی می کنند و فکر کنم مکینتاش از این قابلیت برخوردار نیست.

  • ماژولهای نخ کشی پیتون:

پیتون چند ماژول برای پشتیبانی ازبرنامه نویسی MT شامل thread , threading و Queue را اماده دارد. ماژولهای thread و threading به برنامه نویس اجازه ساختن و اداره نخ را می دهند. ماژول thread برای کار با نخ به صورت ساده و پایه ای است ولی ماژول threading خصوصیات سطح بالا و کاملی از برنامه نویسی نخ در اختیار ما قرار می دهد. ماژول Queue به کاربر اجازه ساختن صف داده را می دهد. این ماژول در محدوده بحث ما نیست و شاید در مقاله دیگری در مورد ان بحث کردیم.

  • ماژول thread :

این ماژول همان طور که گفته شد امکانات کم و سطح پایینی برای کار با چندین نخ در اختیار ما قرار می دهد. تابع اصلی و کلیدی این ماژول start_new_thread() است این تابع خیلی به apply() شباهت دارد.من در اینجا ابتدا چند تا از متدهای این تابع را توضیح می دهم.

1.start_new_thread(function, args, kwargs = None)

شروع یک نخ جدید و عددی که مشخص کننده هویت ان است نخ با گرفتن یک لیست از ارگومانها (که باید در داخل tuple باشند) تابع را اجرا می کند.ارگومان kwargs اختیاری است که با دیکشنری از کلمات کلیدی ارگومانها مشخص می شود. وقتی تابع اجرا شد و بازگشتی ان مشخص شد نخ از کار می افتد.


2.interrupt_main()

ایجاد یک KeyboardInterrupt در نخ اصلی , یک subthread می تواند می تواند از وقفه ایجاد شده در نخ اصلی استفاده کند.

3.exit()

باعث اجرای استثنای SystemExit می شود. اگر نتوانست پیدا کند باعث توقف نخ می شود.

4.allocate_lock()

برگرداندن یک شی lock جدید . متدهای قفل ها در زیر امده اند.

5.get_ident()

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


متدهای مطلق به شی Lock :

1.acguire([waitflag])

برای بدست اوردن و جستجوی lock های قطعی است.

2.locked()

اگر یک lock بدست اورد 1 در غیر این صورت نتیجه 0 است

3.release()

برای ازاد کردن lock



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



01    #Using thread and Locks
02
03    import thread
04    from time import sleep, time, ctime
05    loops = [4, 2]
06    def loop(nloop, nsec, lock):
07        print 'start loop', nloop, 'at:', ctime(time())
08        sleep(nsec)
09        print 'loop', nloop, 'done at:', ctime(time())
10        lock.release()
11    def main():
12        print 'starting threads…'
13        locks = []
14        nloops = range(len(loops))
15
16        for I in nloops:
17            lock = thread.allocate_lock()
18            lock.acquire()
19            locks.append(lock)
20       
21        for I in nloops: 
22            thread.start_new_thread(loop, \
23                (I, loops[i], locks[i])) 
24
25        for I in nloops:
26            while locks[i].locked(): pass
27
28        print 'all DONE at:', ctime(time())
29    
30    if __name__ == '__main__':
31        main()
32


  • ماژول threading :

اگر شما قادر به کار کردن با ماژول thread باشید و درکی از آن داشته باشید از این ماژول نیز می توانید بدون توضیح استفاده کنید البته این ماژول امکانات فراوانی دارد که در ماژول thread وجود ندارد ولی به هر حال یاد گیری آنها ساده است. چون توضیح این ماژول به طور کامل خیلی وقت می برد و باعث طولانی شدن مطالب و شاید سردرگمی شما شوند.

در حال تکمیل توسط pyth0n

منبع:

  • 1.راهنمای خود پیتون
  • 2.کتاب Core Python