آموزش پایتون - چرخه زندگی Thread

یک شیء ترد (Thread) در طول چرخه زندگی خود مراحل مختلفی را طی می‌کند. هنگامی که یک شیء ترد جدید ساخته می‌شود، باید اجرا (Start) شود که این کار متد run() از کلاس thread را فراخوانی می‌کند. این متد حاوی منطق پردازشی است که باید توسط ترد جدید انجام شود. ترد با به پایان رسیدن متد run() وظیفه خود را تکمیل می‌کند و ترد تازه‌ایجادشده با ترد اصلی (Main thread) ادغام می‌شود.

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

thread_life_cycle

مراحل چرخه زندگی ترد در پایتون

مراحل چرخه زندگی ترد در پایتون به شرح زیر است −

  • ایجاد یک ترد − برای ایجاد یک ترد جدید در پایتون، معمولاً از کلاس Thread در ماژول threading استفاده می‌کنید.
  • شروع یک ترد − پس از ایجاد شیء ترد، باید با فراخوانی متد start() آن را شروع کرد. این کار فعالیت ترد را آغاز کرده و متد run() آن را در یک ترد مجزا فراخوانی می‌کند.
  • وضعیت متوقف‌شده/مسدود‌شده − تردهای مختلف به دلایل گوناگونی مانند انتظار برای اتمام عملیات ورودی/خروجی (I/O) یا انجام یک وظیفه توسط ترد دیگر، می‌توانند متوقف یا مسدود شوند. این وضعیت معمولاً با فراخوانی متد join() مدیریت می‌شود. این متد، ترد فراخواننده را تا زمانی که ترد مورد نظر پایان یابد، مسدود نگه می‌دارد.
  • همگام‌سازی تردها − همگام‌سازی، اجرای منظم و مدیریت منابع مشترک بین تردها را تضمین می‌کند. این کار را می‌توان با استفاده از ابزارهای اولیه همگام‌سازی مانند قفل‌ها (Locks)، سیمافورها (Semaphores) یا متغیرهای شرطی (Condition variables) انجام داد.
  • پایان یافتن (Termination) − یک ترد زمانی پایان می‌یابد که اجرای متد run() آن به اتمام برسد؛ چه با انجام کامل وظیفه‌اش و چه با مواجهه با یک استثنا (Exception).

مثال: نمایش چرخه زندگی ترد در پایتون

این مثال، چرخه زندگی ترد در پایتون را با نمایش ایجاد، شروع، اجرا و همگام‌سازی ترد با ترد اصلی نشان می‌دهد.

import threading

def func(x):
   print('Current Thread Details:', threading.current_thread())
   for n in range(x):
      print('{} Running'.format(threading.current_thread().name), n)
   print('Internal Thread Finished...')

# Create thread objects
t1 = threading.Thread(target=func, args=(2,))
t2 = threading.Thread(target=func, args=(3,))

# Start the threads
print('Thread State: CREATED')
t1.start()
t2.start()

# Wait for threads to complete
t1.join()
t2.join()
print('Threads State: FINISHED')

# Simulate main thread work
for i in range(3):
   print('Main Thread Running', i)

print("Main Thread Finished...")

خروجی

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

Thread State: CREATED
Current Thread Details: <Thread(Thread-1 (func), started 140051032258112)>
Thread-1 (func) Running 0
Thread-1 (func) Running 1
Internal Thread Finished...
Current Thread Details: <Thread(Thread-2 (func), started 140051023865408)>
Thread-2 (func) Running 0
Thread-2 (func) Running 1
Thread-2 (func) Running 2
Internal Thread Finished...
Threads State: FINISHED
Main Thread Running 0
Main Thread Running 1
Main Thread Running 2
Main Thread Finished...

مثال: استفاده از یک ابزار اولیه همگام‌سازی

در اینجا مثال دیگری آورده شده است که چرخه زندگی ترد در پایتون شامل وضعیت‌های ایجاد، شروع، اجرا و پایان را همراه با همگام‌سازی با استفاده از سیمافور (Semaphore) نشان می‌دهد.

import threading
import time

# Create a semaphore 
semaphore = threading.Semaphore(2)

def worker():
   with semaphore:
      print('{} has started working'.format(threading.current_thread().name))
      time.sleep(2)
      print('{} has finished working'.format(threading.current_thread().name))

# Create a list to keep track of thread objects
threads = []

# Create and start 5 threads
for i in range(5):
   t = threading.Thread(target=worker, name='Thread-{}'.format(i+1))
   threads.append(t)
   print('{} has been created'.format(t.name))
   t.start()

# Wait for all threads to complete
for t in threads:
   t.join()
   print('{} has terminated'.format(t.name))

print('Threads State: All are FINISHED')
print("Main Thread Finished...")

خروجی

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

Thread-1 has been created
Thread-1 has started working
Thread-2 has been created
Thread-2 has started working
Thread-3 has been created
Thread-4 has been created
Thread-5 has been created
Thread-1 has finished working
Thread-2 has finished working
Thread-3 has started working
Thread-1 has terminated
Thread-2 has terminated
Thread-4 has started working
Thread-3 has finished working
Thread-5 has started working
Thread-3 has terminated
Thread-4 has finished working
Thread-4 has terminated
Thread-5 has finished working
Thread-5 has terminated
Threads State: All are FINISHED
Main Thread Finished...

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.