Python - Creating a Thread

Tạo một luồng trong Python liên quan đến việc khởi tạo một luồng thực thi riêng biệt trong một chương trình, cho phép nhiều hoạt động chạy đồng thời. Điều này đặc biệt hữu ích cho việc thực hiện các tác vụ đồng thời, chẳng hạn như xử lý nhiều hoạt động I/O song song.

Python cung cấp nhiều cách để tạo và quản lý các luồng.

  • Tạo một luồng bằng cách sử dụng mô-đun threading thường được khuyến nghị do giao diện cấp cao hơn và các chức năng bổ sung.

  • Mặt khác, mô-đun _thread cung cấp một cách tiếp cận đơn giản hơn, ở mức thấp hơn để tạo và quản lý các luồng, điều này có thể hữu ích cho các tác vụ luồng đơn giản, ít tốn kém.

Trong hướng dẫn này, bạn sẽ học các kiến thức cơ bản về việc tạo luồng trong Python bằng cách sử dụng các phương pháp khác nhau. Chúng ta sẽ đề cập đến việc tạo luồng bằng cách sử dụng hàm, mở rộng lớp Thread từ mô-đun threading, và sử dụng mô-đun _thread.

Creating Threads with Functions

Bạn có thể tạo các luồng bằng cách sử dụng lớp Thread từ mô-đun threading . Trong cách tiếp cận này, bạn có thể tạo một luồng chỉ bằng cách truyền một hàm vào đối tượng Thread. Dưới đây là các bước để bắt đầu một luồng mới −

  • Define a function that you want the thread to execute.
  • Create a Thread object using the Thread class, passing the target function and its arguments.
  • Call the start method on the Thread object to begin execution.
  • Optionally, call the join method to wait for the thread to complete before proceeding.

Example

Ví dụ dưới đây minh họa việc thực thi đồng thời bằng cách sử dụng các luồng trong Python. Nó tạo và khởi động nhiều luồng thực hiện các tác vụ khác nhau đồng thời bằng cách chỉ định các hàm do người dùng định nghĩa làm mục tiêu trong lớp 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()

Khi thực thi chương trình trên, nó sẽ tạo ra kết quả sau −

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

Creating Threads by Extending the Thread Class

Một cách khác để tạo một luồng là mở rộng lớp Thread. Cách tiếp cận này liên quan đến việc định nghĩa một lớp mới kế thừa từ Thread và ghi đè các phương thức __init__ và run của nó. Dưới đây là các bước để bắt đầu một luồng mới −

  • Define a new subclass of the Thread class.
  • Override the __init__ method to add additional arguments.
  • Override the run method to implement the thread's behavior.

Example

Ví dụ này minh họa cách tạo và quản lý nhiều luồng bằng cách sử dụng một lớp MyThread tùy chỉnh mở rộng lớp threading.Thread trong Python.

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

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

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

Creating Threads using start_new_thread() Function

Hàm start_new_thread() được bao gồm trong _thread module được sử dụng để tạo một luồng mới trong chương trình đang chạy. Mô-đun này cung cấp một cách tiếp cận cơ bản hơn về đa luồng. Nó đơn giản hơn nhưng không có một số tính năng nâng cao được cung cấp bởi mô-đun threading.

Dưới đây là cú pháp của hàm _thread.start_new_thread()

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

Hàm này khởi động một luồng mới và trả về định danh của nó. Tham số function chỉ định hàm mà luồng mới sẽ thực thi. Bất kỳ đối số nào cần thiết cho hàm này có thể được truyền qua args và kwargs.

Example

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)

Nó sẽ tạo ra output

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

Chương trình sẽ rơi vào vòng lặp vô hạn. Bạn sẽ phải nhấn ctrl-c để dừng lại.