Python - Joining the Threads

Trong Python, việc kết nối các luồng có nghĩa là sử dụng phương thức join() để chờ một luồng hoàn thành trước khi chuyển sang các luồng khác. Điều này rất hữu ích trong lập trình đa luồng để đảm bảo rằng một số luồng đã hoàn thành trước khi bắt đầu hoặc tiếp tục với các luồng khác. Bằng cách sử dụng phương thức join() , bạn có thể đảm bảo rằng một luồng đã hoàn thành chạy trước khi một luồng khác hoặc chương trình chính tiếp tục. Trong hướng dẫn này, bạn sẽ được giải thích chi tiết về phương thức join() với các ví dụ phù hợp.

Joining the Threads in Python

Để tham gia các luồng trong Python, bạn có thể sử dụng phương thức Thread.join() từ mô-đun threading . Phương thức này thường được sử dụng để chặn luồng gọi cho đến khi luồng mà trên đó join() được gọi kết thúc. Việc kết thúc có thể là bình thường, do một ngoại lệ không được xử lý - hoặc cho đến khi thời gian chờ tùy chọn xảy ra. Bạn có thể gọi join() nhiều lần. Tuy nhiên, nếu bạn cố gắng tham gia luồng hiện tại hoặc cố gắng tham gia một luồng trước khi khởi động nó bằng phương thức start() , sẽ phát sinh ngoại lệ RuntimeError .

Dưới đây là cú pháp của phương thức Thread.join() −

thread.join(timeout)

Trong đó, timeout là một tham số tùy chọn nhận một số thực xác định thời gian chờ tối đa tính bằng giây (hoặc phần nhỏ hơn của giây). Nếu nó không được cung cấp hoặc là None, phương thức sẽ chặn cho đến khi luồng kết thúc.

Phương thức này luôn trả về None. Sau khi gọi join(), bạn có thể sử dụng is_alive() để kiểm tra xem luồng có còn đang chạy không. Điều này hữu ích để xác định xem cuộc gọi join() có bị hết thời gian hay không.

Example

Ví dụ dưới đây minh họa việc sử dụng join() trong một chương trình đa luồng. Nó khởi động hai luồng (thread1 và thread2). Ban đầu, nó chặn luồng chính cho đến khi thread1 hoàn thành việc thực thi my_function_1. Sau khi thread1 hoàn thành, thread2.start() được gọi, tiếp theo là thread2.join() để đảm bảo rằng luồng chính chờ cho đến khi thread2 hoàn thành việc thực thi my_function_2().

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")

Khi đoạn mã trên được thực thi, nó sẽ tạo ra kết quả sau −

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

Example

Dưới đây là một ví dụ khác minh họa cách phương thức join() với thời gian chờ cho phép chờ một luồng hoàn thành trong một khoảng thời gian xác định, sau đó tiếp tục ngay cả khi luồng chưa hoàn tất.

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")

Khi bạn chạy đoạn mã trên, bạn có thể thấy đầu ra sau:

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