آموزش پایتون - اتصال نخ‌ها

در پایتون، اتصال نخ‌ها (Joining threads) به معنای استفاده از متد ()join برای منتظر ماندن جهت پایان یافتن اجرای یک نخ قبل از رفتن به سراغ نخ‌های دیگر است. این قابلیت در برنامه‌نویسی چندنخی کاربرد دارد تا اطمینان حاصل شود برخی نخ‌ها قبل از شروع یا ادامه کار سایر نخ‌ها به پایان رسیده‌اند. با استفاده از متد ()join، می‌توانید مطمئن شوید که یک نخ پیش از ادامه کار نخ دیگر یا برنامه اصلی، اجرای خود را تمام کرده است. در این آموزش، توضیح کاملی از متد ()join را همراه با مثال‌های مناسب دریافت خواهید کرد.

اتصال نخ‌ها در پایتون

برای اتصال نخ‌ها در پایتون، می‌توانید از متد ()Thread.join از ماژول threading استفاده کنید. این متد عموماً برای مسدود کردن (block) نخ فراخواننده تا زمان پایان یافتن نخی که ()join روی آن فراخوانی شده است، به کار می‌رود. این پایان می‌تواند به صورت عادی، به دلیل یک استثنای مدیریت‌نشده یا تا زمان پایان مهلت زمان تعیین‌شده (timeout) اختیاری باشد. شما می‌توانید ()join را چندین بار فراخوانی کنید. با این حال، اگر تلاش کنید نخ جاری را متصل کنید یا پیش از شروع یک نخ با متد ()start اقدام به فراخوانی join کنید، استثنای RuntimeError رخ خواهد داد.

در ادامه، سنتکس متد ()Thread.join آورده شده است −

thread.join(timeout)

در اینجا، پارامتر timeout یک پارامتر اختیاری است که یک عدد اعشاری را به عنوان حداکثر زمان انتظار بر حسب ثانیه (یا کسر‌هایی از ثانیه) می‌پذیرد. اگر این پارامتر مقداردهی نشود یا None باشد، متد تا زمان پایان یافتن نخ مسدود خواهد ماند.

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

مثال

مثال زیر نحوه استفاده از ()join را در یک برنامه چندنخی نشان می‌دهد. این برنامه دو نخ (thread1 و thread2) را شروع می‌کند. در ابتدا، نخ اصلی را مسدود می‌کند تا زمانی که thread1 اجرای my_function_1 را به پایان برساند. پس از تکمیل thread1، متد ()thread2.start فراخوانی می‌شود و به دنبال آن ()thread2.join اجرا می‌شود تا اطمینان حاصل شود که نخ اصلی تا زمان پایان اجرای my_function_2 توسط thread2 منتظر می‌ماند.

from threading import Thread
from time import sleep

def my_function_1(arg):
   for i in range(arg):
      print("Child Thread 1 running", i)
      sleep(0.5)

def my_function_2(arg):
   for i in range(arg):
      print("Child Thread 2 running", i)
      sleep(0.1)

# Create thread objects
thread1 = Thread(target=my_function_1, args=(5,))
thread2 = Thread(target=my_function_2, args=(3,))

# Start the first thread and wait for it to complete
thread1.start()
thread1.join()

# Start the second thread and wait for it to complete
thread2.start()
thread2.join()

print("Main thread finished...exiting")

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

Child Thread 1 running 0
Child Thread 1 running 1
Child Thread 1 running 2
Child Thread 1 running 3
Child Thread 1 running 4
Child Thread 2 running 0
Child Thread 2 running 1
Child Thread 2 running 2
Main thread finished...exiting

مثال

در اینجا مثال دیگری آورده شده است که نشان می‌دهد چگونه متد ()join همراه با پارامتر timeout امکان انتظار برای تکمیل یک نخ را به مدت مشخصی فراهم می‌کند و سپس حتی اگر نخ به پایان نرسیده باشد، به کار خود ادامه می‌دهد.

from threading import Thread
from time import sleep

def my_function_1(arg):
   for i in range(arg):
      print("Child Thread 1 running", i)
      sleep(0.5)

def my_function_2(arg):
   for i in range(arg):
      print("Child Thread 2 running", i)
      sleep(0.1)

# Create thread objects
thread1 = Thread(target=my_function_1, args=(5,))
thread2 = Thread(target=my_function_2, args=(3,))

# Start the first thread and wait for 0.2 seconds
thread1.start()
thread1.join(timeout=0.2)

# Start the second thread and wait for it to complete
thread2.start()
thread2.join()

print("Main thread finished...exiting")

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

Child Thread 1 running 0
Child Thread 2 running 0
Child Thread 2 running 1
Child Thread 2 running 2
Child Thread 1 running 1
Main thread finished...exiting
Child Thread 1 running 2
Child Thread 1 running 3
Child Thread 1 running 4

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