آموزش پایتون - ایجاد Thread

ایجاد یک ترد (Thread) در پایتون شامل آغاز یک جریان اجرای مجزا در درون یک برنامه است که اجازه می‌دهد چندین عملیات به‌صورت هم‌زمان اجرا شوند. این موضوع به‌ویژه برای انجام هم‌زمان کارها، مانند مدیریت موازی عملیات مختلف ورودی/خروجی (I/O)، بسیار مفید است.

پایتون روش‌های مختلفی برای ایجاد و مدیریت تردها ارائه می‌دهد.

  • ایجاد ترد با استفاده از ماژول threading عموماً به دلیل داشتن رابط سطح بالاتر و قابلیت‌های اضافی پیشنهاد می‌شود.

  • از سوی دیگر، ماژول _thread رویکرد ساده‌تر و سطح پایین‌تری برای ایجاد و مدیریت تردها ارائه می‌دهد که می‌تواند برای کارهای تردینگ ساده و کم‌هزینه مفید باشد.

در این آموزش، اصول اولیه ایجاد تردها در پایتون با استفاده از رویکردهای مختلف را خواهید آموخت. ما موضوعاتی مانند ایجاد ترد با استفاده از توابع، توسعه کلاس Thread از ماژول threading و استفاده از ماژول _thread را پوشش خواهیم داد.

ایجاد تردها با توابع

شما می‌توانید با استفاده از کلاس Thread از ماژول threading ترد ایجاد کنید. در این رویکرد، می‌توانید به‌سادگی با پاس دادن یک تابع به شیء Thread، یک ترد بسازید. در ادامه مراحل شروع یک ترد جدید آمده است −

  • تابعی را که می‌خواهید ترد اجرا کند تعریف کنید.
  • با استفاده از کلاس Thread یک شیء Thread بسازید و تابع هدف و آرگومان‌های آن را ارسال کنید.
  • متد start را روی شیء Thread فراخوانی کنید تا اجرا آغاز شود.
  • به‌عنوان یک گزینه اختیاری، متد join را فراخوانی کنید تا قبل از ادامه، منتظر تکمیل کار ترد بمانید.

مثال

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

from threading import Thread

def addition_of_numbers(x, y):
   result = x + y
   print('Addition of {} + {} = {}'.format(x, y, result))

def cube_number(i):
   result = i ** 3
   print('Cube of {} = {}'.format(i, result))

def basic_function():
   print("Basic function is running concurrently...")

Thread(target=addition_of_numbers, args=(2, 4)).start()  
Thread(target=cube_number, args=(4,)).start() 
Thread(target=basic_function).start()

با اجرای برنامه بالا، نتیجه زیر حاصل می‌شود −

Addition of 2 + 4 = 6
Cube of 4 = 64
Basic function is running concurrently...

ایجاد تردها از طریق توسعه کلاس Thread

رویکرد دیگر برای ایجاد ترد، ارث‌بری و توسعه کلاس Thread است. این رویکرد شامل تعریف یک کلاس جدید است که از Thread ارث‌بری می‌کند و متدهای __init__ و run آن را بازنویسی (Override) می‌نماید. در ادامه مراحل شروع یک ترد جدید آمده است −

  • یک زیرکلاس جدید از کلاس Thread تعریف کنید.
  • متد __init__ را بازنویسی کنید تا آرگومان‌های اضافی اضافه شوند.
  • متد run را بازنویسی کنید تا رفتار ترد پیاده‌سازی شود.

مثال

این مثال نحوه ایجاد و مدیریت چندین ترد را با استفاده از یک کلاس سفارشی MyThread که کلاس threading.Thread را در پایتون توسعه می‌دهد، نشان می‌دهد.

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, 5, self.counter)
      print ("Exiting " + self.name)

def print_time(threadName, counter, delay):
   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()
print ("Exiting Main Thread")

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

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Mon Jun 24 16:38:10 2024
Thread-2: Mon Jun 24 16:38:11 2024
Thread-1: Mon Jun 24 16:38:11 2024
Thread-1: Mon Jun 24 16:38:12 2024
Thread-2: Mon Jun 24 16:38:13 2024
Thread-1: Mon Jun 24 16:38:13 2024
Thread-1: Mon Jun 24 16:38:14 2024
Exiting Thread-1
Thread-2: Mon Jun 24 16:38:15 2024
Thread-2: Mon Jun 24 16:38:17 2024
Thread-2: Mon Jun 24 16:38:19 2024
Exiting Thread-2

ایجاد تردها با استفاده از تابع ()start_new_thread

تابع ()start_new_thread موجود در ماژول _thread برای ایجاد یک ترد جدید در برنامه در حال اجرا استفاده می‌شود. این ماژول رویکردی سطح پایین برای تردینگ ارائه می‌دهد. این روش ساده‌تر است اما برخی از ویژگی‌های پیشرفته ارائه‌شده توسط ماژول threading را ندارد.

در ادامه سنتکس تابع ()_thread.start_new_thread آمده است

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

این تابع یک ترد جدید را شروع می‌کند و شناسه (Identifier) آن را برمی‌گرداند. پارامتر function تابعی را که ترد جدید اجرا خواهد کرد مشخص می‌کند. هر آرگومان مورد نیاز این تابع را می‌توان با استفاده از args و kwargs ارسال کرد.

مثال

import _thread
import time
# Define a function for the thread
def thread_task( threadName, delay):
   for count in range(1, 6):
      time.sleep(delay)
      print ("Thread name: {} Count: {}".format ( threadName, count ))

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

while True:
   pass
   
thread_task("test", 0.3)

این کد خروجی زیر را تولید خواهد کرد −

Thread name: Thread-1 Count: 1
Thread name: Thread-2 Count: 1
Thread name: Thread-1 Count: 2
Thread name: Thread-1 Count: 3
Thread name: Thread-2 Count: 2
Thread name: Thread-1 Count: 4
Thread name: Thread-1 Count: 5
Thread name: Thread-2 Count: 3
Thread name: Thread-2 Count: 4
Thread name: Thread-2 Count: 5
Traceback (most recent call last):
 File "C:\Users\user\example.py", line 17, in <module>
  while True:
KeyboardInterrupt

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

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