Python đa luồng thực sự

Thời gian là yếu tố quan trọng nhất trong cuộc sống. Do tầm quan trọng của nó, thế giới lập trình cung cấp nhiều thủ thuật và kỹ thuật khác nhau giúp bạn giảm đáng kể thời gian tiêu thụ, từ đó tăng hiệu suất. Một cách tiếp cận như vậy là Đa luồng trong Python

Dưới đây là tóm tắt nhanh về tất cả các chuyên ngành được đề cập trong bài viết này

  1. Đa nhiệm trong Python là gì?
  2. một chủ đề là gì?
  3. Khi nào sử dụng đa luồng trong Python?
  4. Làm cách nào để đạt được Đa luồng trong Python?
  5. Làm cách nào để tạo chủ đề trong Python?
  • không tạo lớp
  • bằng cách mở rộng lớp chủ đề
  • không mở rộng lớp chủ đề

6. Ưu điểm của việc sử dụng đa luồng trong Python

Để bắt đầu, trước tiên chúng ta hãy cố gắng hiểu về đa nhiệm trước khi bắt đầu tìm hiểu về Đa luồng trong Python

Đa nhiệm trong Python là gì?

Đa nhiệm nói chung là khả năng thực hiện đồng thời nhiều tác vụ. Về mặt kỹ thuật, đa nhiệm đề cập đến khả năng của một hệ điều hành thực hiện các tác vụ khác nhau cùng một lúc. Chẳng hạn, bạn đang tải xuống thứ gì đó trên PC cũng như nghe các bài hát và đồng thời chơi trò chơi, v.v. Tất cả các tác vụ này được thực hiện bởi cùng một hệ điều hành và đồng bộ hóa. Đây không gì khác ngoài đa nhiệm không chỉ giúp bạn tiết kiệm thời gian mà còn tăng năng suất

Có hai loại đa nhiệm trong một hệ điều hành

  • dựa trên quy trình
  • dựa trên chủ đề

Trong bài viết này, bạn sẽ tìm hiểu về Đa nhiệm dựa trên luồng hoặc Đa luồng

một chủ đề là gì?

Một luồng về cơ bản là một luồng thực thi độc lập. Một tiến trình có thể bao gồm nhiều luồng. Mỗi luồng trong một chương trình thực hiện một nhiệm vụ cụ thể. Ví dụ: khi bạn đang chơi trò chơi FIFA trên PC, toàn bộ trò chơi là một quá trình duy nhất, nhưng nó bao gồm một số luồng chịu trách nhiệm phát nhạc, nhận đầu vào từ người dùng, chạy đối thủ một cách đồng bộ, v.v. Tất cả đều là các luồng riêng biệt chịu trách nhiệm thực hiện các tác vụ khác nhau này trong cùng một chương trình

Mỗi quá trình có một luồng luôn chạy. Đây là chủ đề chính. Chủ đề chính này thực sự tạo ra các đối tượng chủ đề con. Luồng con cũng được khởi tạo bởi luồng chính. Tôi sẽ chỉ cho bạn thêm trong bài viết này cách kiểm tra luồng đang chạy hiện tại

Qua đây hy vọng các bạn đã hiểu rõ thread là gì. Tiếp tục, hãy xem Đa luồng trong Python là gì

Khi nào nên sử dụng Đa luồng trong Python?

Đa luồng rất hữu ích để tiết kiệm thời gian và cải thiện hiệu suất, nhưng nó không thể áp dụng ở mọi nơi
Trong ví dụ trước về FIFA, chuỗi âm nhạc độc lập với chuỗi nhận đầu vào của bạn và chuỗi lấy đầu vào của bạn độc lập với chuỗi chạy đối thủ của bạn. Các luồng này chạy độc lập vì chúng không phụ thuộc lẫn nhau

Do đó, đa luồng chỉ có thể được sử dụng khi không tồn tại sự phụ thuộc giữa các luồng riêng lẻ

Bài viết này cho thấy thêm cách bạn có thể đạt được Đa luồng trong Python

Làm cách nào để đạt được Đa luồng trong Python?

Đa luồng trong Python có thể đạt được bằng cách nhập mô-đun luồng

Trước khi nhập mô-đun này, bạn sẽ phải cài đặt mô-đun này. Để cài đặt cái này trên môi trường anaconda của bạn, hãy thực hiện lệnh sau trên dấu nhắc anaconda của bạn

cài đặt conda -c conda-forge tbb

Sau khi cài đặt thành công, bạn có thể sử dụng bất kỳ lệnh nào sau đây để nhập mô-đun luồng

import threading 
from threading import *

Bây giờ bạn đã cài đặt mô-đun luồng, hãy tiếp tục và thực hiện Đa luồng trong Python

Làm cách nào để tạo chủ đề trong Python?

Chủ đề trong Python có thể được tạo theo ba cách

  1. Không tạo lớp
  2. Bằng cách mở rộng lớp Thread
  3. Không mở rộng lớp Thread

Không tạo lớp

Đa luồng trong Python cũng có thể được thực hiện mà không cần tạo một lớp. Đây là một ví dụ để chứng minh điều tương tự

Thí dụ

from threading import *
print(current_thread().getName())
def mt():
print("Child Thread")
child=Thread(target=mt)
child.start()
print("Executing thread name :",current_thread().getName())

đầu ra

MainThread
Child Thread
Executing thread name : MainThread

Đầu ra ở trên cho thấy luồng đầu tiên hiện diện là luồng chính. Sau đó, luồng chính này tạo một luồng con đang thực thi chức năng và sau đó câu lệnh in cuối cùng được thực hiện lại bởi luồng chính

Bây giờ chúng ta hãy tiếp tục và xem cách thực hiện Đa luồng trong python bằng cách mở rộng lớp Thread

Bằng cách mở rộng lớp Thread

Khi một lớp con được tạo bằng cách mở rộng lớp Thread, lớp con biểu thị rằng một luồng mới đang thực hiện một số tác vụ. Khi mở rộng lớp Thread, lớp con chỉ có thể ghi đè hai phương thức i. e. phương thức __init__() và phương thức run(). Không có phương pháp nào khác có thể được ghi đè ngoài hai phương pháp này

Đây là một ví dụ về cách mở rộng lớp Thread để tạo một luồng

Thí dụ

import threading
import time
class mythread(threading.Thread):
def run(self):
for x in range(7):
print("Hi from child")
a = mythread()
a.start()
a.join()
print("Bye from",current_thread().getName())

đầu ra

Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Bye from MainThread

Ví dụ trên cho thấy lớp myclass đang kế thừa lớp Thread và lớp con i. e myclass đang ghi đè phương thức chạy. Theo mặc định, tham số đầu tiên của bất kỳ hàm lớp nào cần phải là self, là con trỏ tới đối tượng hiện tại. Đầu ra cho thấy luồng con thực thi phương thức run() và luồng chính chờ quá trình thực thi của luồng con hoàn tất. Cái này là do hàm join() làm main thread đợi con kết thúc

Phương pháp tạo chủ đề này là phương pháp được ưa thích nhất vì nó là phương pháp tiêu chuẩn. Nhưng trong trường hợp bạn muốn tạo các luồng mà không kế thừa hoặc mở rộng lớp Thread, bạn có thể thực hiện theo cách sau

Không mở rộng lớp Chủ đề

Để tạo một luồng mà không cần mở rộng lớp Thread, bạn có thể làm như sau
Thí dụ

from threading import *
class ex:
def myfunc(self): #self necessary as first parameter in a class func
for x in range(7):
print("Child")
myobj=ex()
thread1=Thread(target=myobj.myfunc)
thread1.start()
thread1.join()
print("done")

đầu ra

Child
Child
Child
Child
Child
Child
Child
done

Luồng con thực thi myfunc sau đó luồng chính thực thi câu lệnh in cuối cùng

Ưu điểm của việc sử dụng luồng

Đa luồng có nhiều ưu điểm, một số ưu điểm như sau

  • Sử dụng tốt hơn các nguồn tài nguyên
  • Đơn giản hóa mã
  • Cho phép xảy ra đồng thời và song song các tác vụ khác nhau
  • Giảm tiêu thụ thời gian hoặc thời gian phản hồi, do đó, tăng hiệu suất

Dưới đây là một ví dụ để kiểm tra xem mất bao lâu để mã thực thi có và không có đa luồng trong python

Thí dụ

import time
def sqr(n):
for x in n:
time.sleep(1)
x%2
def cube(n):
for x in n:
time.sleep(1)
x%3
n=[1,2,3,4,5,6,7,8]
s=time.time()
sqr(n)
cube(n)
e=time.time()
print(e-s)

đầu ra

________số 8_______

Trên đây là thời gian đầu ra để thực hiện chương trình mà không sử dụng luồng. Bây giờ chúng ta hãy sử dụng các luồng và xem điều gì xảy ra với cùng một chương trình

Thí dụ

import threading
from threading import *
import time
def sqr(n):
for x in n:
time.sleep(1)
print('Remainder after dividing by 2',x%2)
def cube(n):
for x in n:
time.sleep(1)
print('Remainder after dividing by 3',x%3)
n=[1,2,3,4,5,6,7,8]
start=time.time()
t1=Thread(target=sqr,args=(n,))
t2=Thread(target=cube,args=(n,))
t1.start()
time.sleep(1)
t2.start()
t1.join()
t2.join()
end=time.time()
print(end-start)

đầu ra

from threading import *
print(current_thread().getName())
def mt():
print("Child Thread")
child=Thread(target=mt)
child.start()
print("Executing thread name :",current_thread().getName())
0

Đầu ra ở trên cho thấy rõ ràng rằng thời gian thực hiện khi chúng ta sử dụng luồng ít hơn nhiều so với thời gian thực hiện cùng một chương trình mà không sử dụng luồng

Tôi hy vọng bạn hiểu rõ các khái niệm được đề cập trong bài viết này liên quan đến Đa luồng trong Python. Đảm bảo thực hành càng nhiều càng tốt vì đây là một trong những khái niệm quan trọng nhất được sử dụng trong lập trình

Nếu bạn muốn xem thêm các bài viết về các công nghệ đang thịnh hành nhất trên thị trường như Trí tuệ nhân tạo, DevOps, Ethical Hacking, thì bạn có thể tham khảo trang web chính thức của Edureka

Hãy tìm các bài viết khác trong loạt bài này sẽ giải thích nhiều khía cạnh khác của Python và Khoa học dữ liệu

Đa luồng có khả thi trong Python không?

Các luồng nhẹ hơn các quy trình và chia sẻ cùng một không gian bộ nhớ. Trong ví dụ về đa luồng Python này, chúng ta sẽ viết một mô-đun mới để thay thế một mô-đun đơn. py. Mô-đun này sẽ tạo một nhóm gồm tám luồng, tạo thành tổng cộng chín luồng bao gồm cả luồng chính

Python có đồng thời thực sự không?

Python cung cấp cơ chế cho cả đồng thời và song song , mỗi cơ chế có cú pháp và trường hợp sử dụng riêng. Python có hai cơ chế khác nhau để triển khai đồng thời, mặc dù chúng chia sẻ nhiều thành phần chung. Đây là luồng và coroutines hoặc không đồng bộ.

Tại sao Python không phải là luồng

Python không an toàn theo luồng và ban đầu được thiết kế với một thứ gọi là GIL hoặc Khóa phiên dịch toàn cầu, đảm bảo các quy trình được thực thi tuần tự trên CPU của máy tính. On the surface, this means Python programs cannot support multiprocessing.

Vấn đề với đa luồng trong Python là gì?

Nhược điểm. Khi chuyển đổi ngữ cảnh xảy ra, nó chặn tiến trình, vì tiến trình đang duy trì các luồng nên các luồng cũng chặn. Ứng dụng đa luồng không thể tận dụng đa xử lý .