Helpex - Trao đổi & giúp đỡ Đăng nhập

Hướng dẫn chủ đề Python (Phần 1)

Một luồng Python giống như một quá trình và thậm chí có thể là một quá trình, tùy thuộc vào hệ thống luồng của Python. Trong thực tế, các luồng của Python đôi khi được gọi là các quy trình của trọng lượng nhẹ, vì các luồng chiếm ít bộ nhớ hơn và mất ít thời gian để tạo hơn các tiến trình.

Chủ đề cho phép các ứng dụng thực hiện nhiều nhiệm vụ cùng một lúc. Đa luồng rất quan trọng trong nhiều ứng dụng.

Trong Python, một mô-đun luồng được sử dụng để tạo các luồng. Để tạo chủ đề, các mô-đun luồng có thể được sử dụng theo hai cách. Thứ nhất, bằng cách kế thừa lớp và thứ hai bằng cách sử dụng hàm luồng.

Tạo chủ đề Python bằng Class

Hãy để chúng tôi hiểu bằng cách sử dụng mã.

import threading

class mythread(threading.Thread):

  def __init__(self, i):

  threading.Thread.__init__(self)

self.h = i

def run(self):

  print“ Value send“, self.h

thread1 = mythread(1)

thread1.start()
  • Lớp mới mythread kế thừa threading.Thread lớp Python .
  • __init__(self [,args]):  Ghi đè lên hàm tạo.
  • run(): Đây là phần mà bạn có thể đặt phần logic của mình.
  • start()start() Phương thức bắt đầu một luồng Python.
  • Các  mythread lớp học sẽ ghi đè các nhà xây dựng, vì vậy các nhà xây dựng lớp cơ sở ( Thread.__init__()) phải được gọi.

Tạo chủ đề Python bằng hàm

import threading

def fun1(a, b):

  c = a + b

print(c)

thread1 = threading.Thread(target = fun1, args = (12, 10))

thread1.start()

Các mã trên rất đơn giản. Chỉ cần tạo một chức năng và làm cho nó chạy bởi một chủ đề. Cú pháp

threading.Thread(target=fun1, args=(12,10)) creates a thread, the target = fun1

xác định hàm sẽ được chạy và  args chỉ ra bộ dữ liệu chứa đối số được truyền cho hàm.

Phương pháp luồng quan trọng

Chúng ta hãy xem một số phương thức quan trọng, được xác định trong các mô-đun luồng.

threading.activeCount(): Trả về số lượng tổng số luồng Python đang hoạt động.

Hãy để chúng tôi hiểu bằng ví dụ.

Hãy cho chúng tôi xem đầu ra.

import threading

import time

def fun1(a, b):

  time.sleep(1)

c = a + b

print(c)

thread1 = threading.Thread(target = fun1, args = (12, 10))

thread1.start()

thread2 = threading.Thread(target = fun1, args = (10, 17))

thread2.start()

print(“Total number of threads”, threading.activeCount())

print(“List of threads: “, threading.enumerate())

Hướng dẫn chủ đề Python (Phần 1)Hình 1: Tất cả các chủ đề và danh sách chủ đề

Bây giờ nhận xét ra dòng  time.sleep(1) và sau đó chạy lại mã.
Hướng dẫn chủ đề Python (Phần 1)Hình 2: Không có thời gian ngủ

Bạn có thể thấy sự khác biệt. Các tuyên bố  threading.activeCount() và  threading.enumerate() đã chạy chủ đề chính hoặc quá trình chính. Vì vậy, luồng chính chịu trách nhiệm chạy toàn bộ chương trình. Trong Hình 1, khi luồng chính được thực thi   threading.activeCount(), thread1 và thread2 đã hoạt động.

Khi chúng tôi nhận xét  time.sleep(1) cú pháp và thực thi lại mã thì thread1 và thread3 có thể không hoạt động.

Phương thức tham gia

Trước khi thảo luận về ý nghĩa của  join phương pháp, chúng ta hãy xem chương trình sau đây.

Trong chương trình trên, hai luồng đã được tạo bằng các đối số. Trong hàm mục tiêu  fun1, một danh sách toàn cầu  list1, được thêm vào một đối số. Hãy cho chúng tôi xem kết quả.

import threading

import time

list1 = []

def fun1(a):

  time.sleep(1)# complex calculation takes 1 seconds

list1.append(a)

thread1 = threading.Thread(target = fun1, args = (1, ))

thread1.start()

thread2 = threading.Thread(target = fun1, args = (6, ))

thread2.start()

print(“List1 is: “, list1)

Hướng dẫn chủ đề Python (Phần 1)Hình 3: Hiển thị danh sách trống

Hình trên đang hiển thị danh sách trống, nhưng danh sách dự kiến ​​sẽ được điền với các giá trị 1 và 6. Câu lệnh  print (“List1 is : “, list1) được thực thi bởi luồng chính và luồng chính đã in danh sách trước khi điền vào.

Do đó, luồng chính phải được tạm dừng cho đến khi tất cả các luồng hoàn thành công việc của họ. Để đạt được điều này, chúng ta sẽ sử dụng  join phương pháp.

Hãy xem mã sửa đổi.

import threading

import time

list1 = []

def fun1(a):

  time.sleep(1)# complex calculation takes 1 seconds

list1.append(a)

thread1 = threading.Thread(target = fun1, args = (1, ))

thread1.start()

thread2 = threading.Thread(target = fun1, args = (6, ))

thread2.start()

thread1.join()

thread2.join()

print(“List1 is: “, list1)

Ane ở đây là đầu ra.

Hướng dẫn chủ đề Python (Phần 1)Hình 4: Sử dụng  join phương thức

Trong đoạn mã trên, cú pháp  thread1.join() chặn luồng chính cho đến khi  thread1 hoàn thành nhiệm vụ của nó. Để đạt được sự song song,  join phương thức phải được gọi sau khi tạo tất cả các luồng.

Chúng ta hãy xem thêm các trường hợp sử dụng  join phương pháp.

import threading

import time

import datetime

t1 = datetime.datetime.now()

list1 = []

def fun1(a):

  time.sleep(1)# complex calculation takes 1 seconds

list1.append(a)

list_thread = []

for each in range(10):

  thread1 = threading.Thread(target = fun1, args = (each, ))

list_thread.append(thread1)

thread1.start()

for th in list_thread:

  th.join()

print(“List1 is: “, list1)

t2 = datetime.datetime.now()

print(“Time taken”, t2 - t1)

Trong đoạn mã trên, chúng tôi đã sử dụng một vòng lặp for để tạo 10 luồng. Mỗi chủ đề đang được thêm vào trong danh sách ,  list_thread. Sau khi tạo ra tất cả các chủ đề, chúng tôi sử dụng  join m ethod. Chúng ta hãy xem đầu ra.

Hướng dẫn chủ đề Python (Phần 1)Hình 5: Ra khỏi  join vòng lặp

Thời gian thực hiện là khoảng 1 giây. Vì mỗi luồng chỉ mất 1 giây và chúng tôi đã sử dụng song song dựa trên luồng, tổng thời gian thực hiện để thực thi mã là gần 1 giây. Nếu bạn sử dụng  join phương thức sau khi tạo mỗi chương trình luồng, sẽ mất hơn 10 giây.

Để làm rõ hơn, xem mã sau đây.

import threading

import time

import datetime

t1 = datetime.datetime.now()

list1 = []

def fun1(a):

  time.sleep(1)# complex calculation takes 1 seconds

list1.append(a)

for each in range(10):

  thread1 = threading.Thread(target = fun1, args = (each, ))

thread1.start()

thread1.join()

print(“List1 is: “, list1)

t2 = datetime.datetime.now()

print(“Time taken”, t2 - t1)

Đầu ra:

Hướng dẫn chủ đề Python (Phần 1)Hình 6: Thread với  join phương thức

Từ đầu ra trên, rõ ràng thời gian thực hiện là 10 giây. Điều này có nghĩa là không có sự song song nào đạt được vì  join() phương thức của luồng đầu tiên đã được gọi trước khi tạo luồng thứ hai.

tham gia () Phương thức với thời gian

Chúng ta hãy nhìn vào đoạn mã sau đây.

import threading

import time

def fun1(a):

  time.sleep(3)# complex calculation takes 3 seconds

thread1 = threading.Thread(target = fun1, args = (1, ))

thread1.start()

thread1.join()

print(thread1.isAlive())

Một vài điều mới mẻ ở đây. Các  isAlive() phương thức trả về True hoặc False. Nếu luồng hiện đang hoạt động thì phương thức  isAlive() trả về True; mặt khác, nó trả về Sai.

Đầu ra:
Hướng dẫn chủ đề Python (Phần 1)

Đầu ra trên cho thấy rằng chủ đề không hoạt động.

Hãy thực hiện một thay đổi nhỏ - thay đổi  thread1.join() thành  thread1.join(2). Điều này báo cho chương trình chặn luồng chính chỉ trong 2 giây.

Hãy xem đầu ra:
Hướng dẫn chủ đề Python (Phần 1)

Ở đầu ra trên, luồng vẫn hoạt động vì  join(2) tiếp tục chặn luồng chính trong 2 giây nhưng luồng mất 3 giây để hoàn thành nhiệm vụ.

phân luồng.Timer ()

Phương pháp này được sử dụng để đặt thời gian. Hãy để chúng tôi hiểu cú pháp.

threading.Timer(interval, function, args=[], kwargs={})

Ý nghĩa của cú pháp trên là sau một khoảng thời gian xác định, tính bằng giây, trình thông dịch sẽ thực thi hàm với  args và  kwargs.

2 hữu ích 0 bình luận 6.9k xem chia sẻ

Có thể bạn quan tâm

loading