آموزش برنامه نویسی چند رشته ای در برنامه نویسی پایتون ۳

2 سال پیش

 آموزش برنامه نویسی چند رشته ای در برنامه نویسی پایتون ۳

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

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

اجرای چندین رشته مشابه اجرای چندین برنامه مختلف به طور همزمان است، اما با مزایای زیر:

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

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

  • می توان آن را از قبل (قطع) کرد.
  • می توان آن را به طور موقت در حالت تعلیق قرار داد (همچنین به عنوان خواب شناخته می شود) در حالی که رشته های دیگر در حال اجرا هستند – به این حالت تسلیم می گویند.

دو نوع مختلف از موضوعات وجود دارد –

  • kernel thread
  • user thread

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

دو ماژول وجود دارد که از استفاده از نخ ها در Python3 – پشتیبانی می کند

  • thread_
  • threading

ماژول thread برای مدت طولانی “منسوخ” شده است. به کاربران توصیه می شود به جای آن از ماژول threading استفاده کنند. از این رو، در پایتون ۳، ماژول “رشته” دیگر در دسترس نیست. با این حال، برای سازگاری با عقب در Python3 به “_thread” تغییر نام داده است.

شروع یک رشته جدید

برای ایجاد یک رشته دیگر، باید روش زیر را که در ماژول thread موجود است فراخوانی کنید

_thread.start_new_thread ( function, args[, kwargs] )

 

این فراخوانی روشی سریع و کارآمد را برای ایجاد موضوعات جدید در لینوکس و ویندوز امکان پذیر می کند.

فراخوانی متد فوراً برمی‌گردد و رشته فرزند شروع می‌شود و تابع را با لیست ارسال شده از آرگ‌ها فراخوانی می‌کند. وقتی تابع برمی گردد، رشته خاتمه می یابد.

در اینجا، args مجموعه ای از استدلال ها است. از یک تاپل خالی برای فراخوانی تابع بدون ارسال هیچ آرگومان استفاده کنید. kwargs یک فرهنگ لغت اختیاری از آرگومان های کلیدواژه است.

مثال

#!/usr/bin/python3

import _thread
import time

# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print ("%s: %s" % ( threadName, time.ctime(time.time()) ))

# Create two threads as follows
try:
   _thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   _thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print ("Error: unable to start thread")

while 1:
   pass

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Thread-1: Fri Feb 19 09:41:39 2016
Thread-2: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:43 2016
Thread-2: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:47 2016
Thread-2: Fri Feb 19 09:41:49 2016
Thread-2: Fri Feb 19 09:41:53 2016

 

برنامه در یک حلقه بی نهایت می رود. برای توقف باید ctrl-c را فشار دهید

اگرچه برای threading سطح پایین بسیار موثر است، ماژول thread در مقایسه با ماژول threading جدید بسیار محدود است.

 

ماژول Threading

ماژول threading جدیدتر همراه با Python 2.4 پشتیبانی بسیار قدرتمندتر و سطح بالا را از رشته ها نسبت به ماژول thread که در بخش قبل مورد بحث قرار گرفت، ارائه می دهد.

ماژول threading تمام روش های ماژول thread را نشان می دهد و روش های اضافی را ارائه می دهد –

  • ()threading.activeCount – تعداد اشیاء رشته فعال را برمی‌گرداند.
  • ()threading.currentThread – تعداد اشیاء رشته را در کنترل رشته تماس گیرنده برمی گرداند.
  • ()threading.enumerate – فهرستی از تمام اشیاء رشته ای که در حال حاضر فعال هستند را برمی گرداند.

علاوه بر متدها، ماژول threading دارای کلاس Thread است که threading را پیاده سازی می کند. متدهای ارائه شده توسط کلاس Thread به شرح زیر است –

  • ()run – متد ()run نقطه ورودی یک رشته است.
  • ()start – متد ()start یک رشته را با فراخوانی متد run شروع می کند.
  • ()join([time])() – join منتظر می ماند تا رشته ها خاتمه یابد.
  • ()isAlive – متد ()isAlive بررسی می کند که آیا یک رشته هنوز در حال اجرا است یا خیر.
  • getName – متد ()getName نام یک رشته را برمی گرداند.
  • setName- متد ()setName نام یک رشته را تنظیم می کند.

ایجاد رشته با استفاده از Threading Module

برای پیاده سازی یک رشته جدید با استفاده از ماژول threading، باید موارد زیر را انجام دهید –

  • یک زیر کلاس جدید از کلاس Thread تعریف کنید.
  • برای افزودن آرگومان های اضافی، روش __init__(self [,args]) را لغو کنید.
  • سپس، روش run(self [,args]) را نادیده بگیرید تا کاری را که thread باید در هنگام شروع انجام دهد، اجرا کنید.

هنگامی که زیرکلاس Thread جدید را ایجاد کردید، می توانید یک نمونه از آن ایجاد کنید و سپس با فراخوانی start()، که به نوبه خود متد ()run را فراخوانی می کند، یک رشته جدید را شروع کنید.

 

مثال

#!/usr/bin/python3

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print ("Starting " + self.name)
      print_time(self.name, self.counter, 5)
      print ("Exiting " + self.name)

def print_time(threadName, delay, counter):
   while counter:
      if exitFlag:
         threadName.exit()
      time.sleep(delay)
      print ("%s: %s" % (threadName, time.ctime(time.time())))
      counter -= 1

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("Exiting Main Thread")

 

وقتی برنامه فوق را اجرا می کنیم، نتیجه زیر را ایجاد می کند –

Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:00:21 2016
Thread-2: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:23 2016
Thread-2: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:25 2016
Exiting Thread-1
Thread-2: Fri Feb 19 10:00:26 2016
Thread-2: Fri Feb 19 10:00:28 2016
Thread-2: Fri Feb 19 10:00:30 2016
Exiting Thread-2
Exiting Main Thread

 

همگام سازی رشته ها

ماژول threading ارائه شده با پایتون شامل یک مکانیسم قفل ساده برای پیاده سازی است که به شما امکان می دهد رشته ها را همگام کنید. یک قفل جدید با فراخوانی متد ()Lock ایجاد می شود که قفل جدید را برمی گرداند.

روش کسب (بلاک) شی قفل جدید برای وادار کردن رشته ها به اجرای همزمان استفاده می شود. پارامتر انسداد اختیاری به شما امکان می‌دهد کنترل کنید که آیا نخ برای گرفتن قفل منتظر می‌ماند یا خیر.

اگر انسداد روی ۰ تنظیم شده باشد، در صورتی که قفل قابل دستیابی نباشد، رشته بلافاصله با یک مقدار ۰ و اگر قفل به دست آمده باشد، با یک مقدار ۱ برمی گردد. اگر انسداد روی ۱ تنظیم شود، نخ مسدود شده و منتظر بمانید تا قفل آزاد شود.

متد ()release شیء قفل جدید برای آزاد کردن قفل زمانی که دیگر مورد نیاز نیست استفاده می شود.

 

مثال

#!/usr/bin/python3

import threading
import time

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print ("Starting " + self.name)
      # Get lock to synchronize threads
      threadLock.acquire()
      print_time(self.name, self.counter, 3)
      # Free lock to release next thread
      threadLock.release()

def print_time(threadName, delay, counter):
   while counter:
      time.sleep(delay)
      print ("%s: %s" % (threadName, time.ctime(time.time())))
      counter -= 1

threadLock = threading.Lock()
threads = []

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

# Add threads to thread list
threads.append(thread1)
threads.append(thread2)

# Wait for all threads to complete
for t in threads:
   t.join()
print ("Exiting Main Thread")

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:04:14 2016
Thread-1: Fri Feb 19 10:04:15 2016
Thread-1: Fri Feb 19 10:04:16 2016
Thread-2: Fri Feb 19 10:04:18 2016
Thread-2: Fri Feb 19 10:04:20 2016
Thread-2: Fri Feb 19 10:04:22 2016
Exiting Main Thread

 

صف اولویت چند رشته ای

ماژول Queue به شما این امکان را می دهد که یک شیء صف جدید ایجاد کنید که بتواند تعداد خاصی از آیتم ها را در خود جای دهد. روش های زیر برای کنترل صف − وجود دارد

  • ()get() – get یک آیتم را از صف حذف و برمی گرداند.
  • ()put() – put مورد را به یک صف اضافه می کند.
  • ()qsize() – qsize تعداد آیتم هایی را که در حال حاضر در صف هستند برمی گرداند.
  • ()vala – در صورتی که صف خالی باشد، خالی () True را برمی گرداند. در غیر این صورت، نادرست.
  • ()full() – full اگر صف پر باشد True را برمی گرداند. در غیر این صورت، نادرست.

 

مثال

#!/usr/bin/python3

import queue
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, q):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.q = q
   def run(self):
      print ("Starting " + self.name)
      process_data(self.name, self.q)
      print ("Exiting " + self.name)

def process_data(threadName, q):
   while not exitFlag:
      queueLock.acquire()
      if not workQueue.empty():
         data = q.get()
         queueLock.release()
         print ("%s processing %s" % (threadName, data))
      else:
         queueLock.release()
         time.sleep(1)

threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1

# Create new threads
for tName in threadList:
   thread = myThread(threadID, tName, workQueue)
   thread.start()
   threads.append(thread)
   threadID += 1

# Fill the queue
queueLock.acquire()
for word in nameList:
   workQueue.put(word)
queueLock.release()

# Wait for queue to empty
while not workQueue.empty():
   pass

# Notify threads it's time to exit
exitFlag = 1

# Wait for all threads to complete
for t in threads:
   t.join()
print ("Exiting Main Thread")

 

خروجی

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread

 

منبع.

 

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

  1. آموزش برنامه نویسی پایتون ۳
  2. آموزش موارد جدید در برنامه نویسی پایتون ۳
  3. آموزش مرور کلی برنامه نویسی پایتون ۳
  4. آموزش راه اندازی محیط برنامه نویسی پایتون ۳
  5. آموزش نحو در برنامه نویسی پایتون ۳
  6. آموزش انواع متغیرها در برنامه نویسی پایتون ۳
  7.  آموزش عملگرهای پایه در برنامه نویسی پایتون ۳
  8.  آموزش تصمیم گیری در برنامه نویسی پایتون ۳
  9.  آموزش حلقه ها در برنامه نویسی پایتون ۳
  10. آموزش اعداد در برنامه نویسی پایتون ۳
  11. آموزش رشته ها در برنامه نویسی پایتون ۳
  12.  آموزش لیست ها در برنامه نویسی پایتون ۳
  13.  آموزش تاپل ها در برنامه نویسی پایتون ۳
  14. آموزش دیکشنری در برنامه نویسی پایتون ۳
  15.  آموزش تاریخ و زمان در برنامه نویسی پایتون ۳
  16.  آموزش توابع در برنامه نویسی پایتون ۳
  17. آموزش ماژول ها در برنامه نویسی پایتون ۳
  18. آموزش فایل های ورودی/خروجی در برنامه نویسی پایتون ۳
  19. آموزش مدیریت استثنا در برنامه نویسی پایتون ۳
  20. آموزش شی گرایی در برنامه نویسی پایتون ۳
  21.  آموزش عبارات منظم در برنامه نویسی پایتون ۳
  22. آموزش CGI در برنامه نویسی پایتون ۳
  23.  آموزش دسترسی به پایگاه داده MySQL در برنامه نویسی پایتون ۳
  24.  آموزش برنامه نویسی شبکه در برنامه نویسی پایتون ۳
  25. آموزش ارسال ایمیل با استفاده از SMTP در برنامه نویسی پایتون ۳
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه