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.
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.
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 −
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...
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 −
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
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.
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.