Đa luồng trong Python là gì, hãy cho một ví dụ?

Đa luồng là khả năng của một chương trình hoặc một hệ điều hành cho phép nhiều người dùng cùng một lúc mà không yêu cầu nhiều bản sao của chương trình đang chạy trên máy tính. Đa luồng cũng có thể xử lý các yêu cầu khác nhau từ cùng một người dùng. Mỗi yêu cầu của người dùng đối với một chương trình hoặc dịch vụ hệ thống được theo dõi dưới dạng một luồng có danh tính riêng. Khi các chương trình hoạt động thay mặt cho yêu cầu luồng ban đầu và bị gián đoạn bởi các yêu cầu khác, trạng thái công việc của yêu cầu ban đầu được theo dõi cho đến khi hoàn thành công việc. Trong bối cảnh này, người dùng cũng có thể là một chương trình khác

Phạm vi

Trong bài báo này,

  • Chúng ta sẽ tìm hiểu về Quy trình, Chủ đề, Đa luồng và Đa xử lý trong Python
  • Chúng ta cũng sẽ thảo luận về Tại sao và Khi nào nên Sử dụng Đa luồng?

Giới thiệu

Chúng ta đều biết câu nói nổi tiếng- Thời gian là tiền bạc. Người ta luôn nói rằng con người không được tạo ra để làm nhiều việc cùng một lúc. Nhưng đó là nơi máy móc đến. Vì vậy, mặc dù bạn có thể không thực hiện được đa nhiệm một cách dễ dàng, nhưng chúng tôi sẽ nói về các mẹo và thủ thuật giúp tăng hiệu suất và giảm mức tiêu thụ thời gian, trong trường hợp máy tính. Bạn có thể đoán những gì chúng ta sẽ tìm hiểu về ngày hôm nay?

Phương pháp đa nhiệm mà chúng ta sẽ thảo luận trong hướng dẫn này là đa luồng trong Python

Quy trình là gì?

Một chương trình đang thực thi được gọi là một tiến trình. Khi bạn khởi động bất kỳ ứng dụng hoặc chương trình nào trên máy tính của mình, chẳng hạn như trình duyệt internet, hệ điều hành sẽ coi đó là một quá trình

Một quy trình có thể bao gồm một số luồng thực thi có thể thực thi đồng thời. Nói cách khác, chúng ta có thể nói rằng một quy trình tạo điều kiện cho đa luồng

Chủ đề là gì?

Trong Khoa học Máy tính, một luồng đồng nghĩa với các quy trình nhẹ. Vì vậy, một luồng không là gì ngoài một luồng thực thi độc lập. Nó cũng có thể được định nghĩa là một thể hiện của một quá trình

Chắc hẳn bạn đang thắc mắc, quy trình là gì?

Nói một cách đơn giản, một luồng là một chuỗi các hướng dẫn mà máy tính thực hiện. Nó được thực hiện độc lập. Tùy thuộc vào kịch bản, một luồng cũng có thể được sử dụng trước hoặc đưa vào chế độ ngủ

Lưu ý-Preemption đề cập đến hành động tạm thời dừng một nhiệm vụ để tiếp tục sau đó. Vì vậy, trong trường hợp này, luồng có thể bị gián đoạn tạm thời bởi bộ xử lý

Nhưng trong trường hợp triển khai Python 3, các luồng dường như chỉ được thực thi đồng thời

Để hỗ trợ đa luồng trong Python, chúng ta có thể sử dụng các mô-đun sau do Python cung cấp –

  • mô-đun chủ đề
  • mô-đun luồng

Với mô-đun Threading trong Python, cung cấp API rất trực quan để sinh ra các luồng, chúng ta có thể thực hiện đa luồng trong Python khá hiệu quả

Đa luồng trong Python là gì?

Nếu bạn muốn tiết kiệm thời gian và cải thiện hiệu suất, bạn nên sử dụng đa luồng trong Python

Đa luồng trong Python là một kỹ thuật phổ biến cho phép thực thi đồng thời nhiều tác vụ. Nói một cách đơn giản, khả năng bộ xử lý thực thi đồng thời nhiều luồng được gọi là đa luồng

Python đa luồng tạo điều kiện chia sẻ không gian dữ liệu và tài nguyên của nhiều luồng với luồng chính. Nó cho phép giao tiếp hiệu quả và dễ dàng giữa các chủ đề

Đa xử lý là gì?

Khả năng của bộ xử lý thực hiện đồng thời một số quy trình không liên quan được gọi là đa xử lý. Các quy trình này không chia sẻ bất kỳ tài nguyên nào

Đa xử lý chia nhỏ các quy trình thành các quy trình nhỏ hơn chạy độc lập. Càng nhiều tác vụ mà một bộ xử lý phải gánh, bộ xử lý càng khó theo dõi chúng hơn. Nó rõ ràng làm phát sinh nhu cầu đa xử lý. Đa xử lý cố gắng đảm bảo rằng mọi bộ xử lý đều có bộ xử lý/lõi bộ xử lý riêng và việc thực thi không gặp rắc rối

Lưu ý-Trong trường hợp hệ thống bộ xử lý đa lõi như Intel i3, lõi bộ xử lý được phân bổ cho một quy trình

Đa luồng Python vs Đa xử lý

Những khác biệt chính cần lưu ý giữa Đa luồng và Đa xử lý như sau -

Đa luồngĐa xử lýĐó là một kỹ thuật trong đó một quá trình sinh ra nhiều luồng đồng thời. Đây là kỹ thuật trong đó nhiều quy trình chạy đồng thời trên nhiều bộ xử lý/lõi bộ xử lý. Python đa luồng thực hiện đồng thời. Đa xử lý Python thực hiện song song ở dạng chân thực nhất. Nó tạo ảo giác rằng chúng đang chạy song song, nhưng chúng hoạt động đồng thời. Song song theo nghĩa là mô-đun đa xử lý tạo điều kiện thuận lợi cho việc chạy song song các quy trình độc lập bằng cách sử dụng các quy trình con. Trong đa luồng, GIL hoặc Khóa phiên dịch toàn cầu ngăn các luồng chạy đồng thời. Trong đa xử lý, mỗi quy trình có Trình thông dịch Python riêng thực hiện việc thực thi

Tại sao và khi nào nên sử dụng đa luồng trong Python?

Nếu bạn muốn chia nhỏ các tác vụ và ứng dụng của mình thành nhiều tác vụ con và sau đó thực thi chúng đồng thời, thì đa luồng trong Python là lựa chọn tốt nhất cho bạn. Tất cả các khía cạnh quan trọng như hiệu suất, kết xuất, tốc độ và mức tiêu thụ thời gian sẽ được cải thiện đáng kể bằng cách sử dụng đa luồng Python phù hợp

Đa luồng trong Python chỉ nên được sử dụng khi không có sự phụ thuộc lẫn nhau giữa các luồng

Bắt đầu một chủ đề mới

Sau khi tìm hiểu thread là gì, bước tiếp theo là học cách tạo thread. Python cung cấp một thư viện tiêu chuẩn gọi là "luồng" để thực hiện đa luồng trong Python

Cú pháp để tạo một chủ đề mới như sau –

Trong đa luồng Python, có hai cách để bạn có thể bắt đầu một luồng mới-

1. Sử dụng mô-đun luồng

Chúng ta hãy xem đoạn mã mà chúng ta có thể tạo một luồng mới bằng cách sử dụng Mô-đun phân luồng –

from threading import *
def MyThread1[]:
    print["I am in thread1.", "Current Thread in Execution is", current_thread[].getName[]]
def MyThread2[]:
    print["I am in thread2.", "Current Thread in Execution is", current_thread[].getName[]]
t1 = Thread[target=MyThread1, args=[]]
t2 = Thread[target=MyThread2, args=[]]
t1.start[]
t2.start[]

đầu ra

I am in thread1. Current Thread in Execution is Thread-1
I am in thread2. Current Thread in Execution is Thread-2

2. Sử dụng mô-đun chủ đề

Cách tạo một luồng mới bằng mô-đun Thread như sau –

import _thread
def MyThread1[]:
    print["This is thread1"]
def MyThread2[]:
    print["This is thread2"]
 
_thread.start_new_thread[MyThread1, []]
_thread.start_new_thread[MyThread2, []]

đầu ra

This is thread1
This is thread2

Ghi chú. Đầu ra của đoạn mã trên có thể khác nhau đối với các lần chạy khác nhau. Nó xảy ra vì đa luồng trong Python sử dụng mô-đun _thread không ổn định. Không ai có thể biết luồng nào sẽ được thực thi trước. Mô-đun _thread coi các luồng là các hàm trong khi mô-đun Luồng được triển khai theo cách hướng đối tượng, có nghĩa là mọi luồng tương ứng với một đối tượng. Mô-đun _thread cũng không được dùng nữa và chỉ được sử dụng cho các trường hợp không tương thích ngược trong Python3

Trong số hai phương pháp, phương pháp được đề xuất là sử dụng mô-đun Threading, mô-đun này chúng ta sẽ khám phá sâu hơn trong các phần sắp tới của bài viết. Mô-đun Phân luồng được ưa thích hơn vì các API trực quan của nó giúp chúng tôi đồng bộ hóa các lần thực thi luồng, do đó làm cho nó có thể dự đoán được và có độ tin cậy cao

Làm việc với nhiều chủ đề

Thường xuyên hơn không, bạn sẽ làm việc với nhiều luồng và thực hiện công việc thú vị với chúng

Bạn có thể tạo các chủ đề riêng lẻ, như chúng ta đã thấy ở trên. Nhưng có một cách dễ dàng và hiệu quả hơn để làm điều đó. Chúng tôi làm điều này bằng cách sử dụng ThreadPoolExecutor trong Python

Sử dụng ThreadPoolExecutor

Cách dễ nhất để làm việc với nhiều luồng là sử dụng ThreadPoolExecutor, một phần của thư viện Python chuẩn. Nó thuộc về đồng thời. thư viện tính năng

Sử dụng câu lệnh with, bạn có thể tạo trình quản lý ngữ cảnh. Nó sẽ cho phép bạn tạo và xóa một nhóm hiệu quả. Chúng tôi cũng có thể nhập trực tiếp ThreadPoolExecutor từ đồng thời. thư viện tính năng

Cú pháp để tạo ThreadPoolExecutor là-

executor = ThreadPoolExecutor[max_workers=””]

Tham số max_worker có thể lấy bất kỳ giá trị số nguyên nào dựa trên kịch bản

Chúng ta hãy xem đoạn mã sau để xem làm thế nào để đạt được điều này –

from concurrent.futures import ThreadPoolExecutor
import threading
import random
 
def task[]:
    print["Executing the given task"]
    result = 0
    i = 0
    for i in range[10]:
        result = result + i
    print["I: {}".format[result]]
    print["The task is executed {}".format[threading.current_thread[]]]
 
def main[]:
    executor = ThreadPoolExecutor[max_workers=3]
    task1 = executor.submit[task]
    task2 = executor.submit[task]
 
if __name__ == '__main__':
    main[]

Đầu ra –

Executing the given task
I: 45
Executing the given task
The task is ececuted 
I: 45
The task is ececuted 

Mô-đun luồng

Mô-đun luồng là triển khai cấp cao của đa luồng trong Python. Đó là cách tiếp cận để quản lý các ứng dụng đa luồng. Lợi ích của mô-đun Threading vượt trội so với mô-đun Threading

Cùng với các phương thức của mô-đun Luồng, mô-đun Luồng cung cấp các phương thức bổ sung như –

  • xâu chuỗi. activeCount[] - Hàm này trả về số lượng đối tượng luồng đang hoạt động
  • xâu chuỗi. currentThread[] − Hàm này trả về số lượng đối tượng nằm dưới sự kiểm soát luồng của người gọi
  • xâu chuỗi. enumerate[] −Điều này trả về danh sách tất cả các đối tượng luồng hiện đang hoạt động

Điều kiện cuộc đua

Điều kiện chủng tộc là một trong những vấn đề chính bạn sẽ gặp phải khi làm việc với đa luồng trong Python

Thông thường nhất, điều kiện tranh đua xảy ra khi hai hoặc nhiều luồng truy cập vào phần dữ liệu và tài nguyên được chia sẻ. Trong đa luồng thời gian thực trong Python, nó có thể xảy ra khi các luồng trùng nhau. Giải pháp cho vấn đề này là đồng bộ hóa các chủ đề mà chúng ta sẽ xem thêm

Đồng bộ chủ đề

Trong Python, bạn có thể triển khai cơ chế khóa để cho phép bạn đồng bộ hóa các chuỗi

Khóa nguyên thủy đồng bộ hóa cấp thấp được triển khai thông qua mô-đun _thread

Một luồng có thể có một trong hai trạng thái sau -

Lớp được sử dụng để thực hiện các khóa nguyên thủy được gọi là Khóa. Các đối tượng khóa được tạo để làm cho các luồng chạy đồng bộ. Chỉ có một chủ đề tại một thời điểm có thể có một khóa

Hai phương thức được hỗ trợ bởi một đối tượng khóa là –

  1. thu được [] – Phương thức này thay đổi trạng thái của khóa đã mở. Nhưng nếu nó đã bị khóa, phương thức thu được [] sẽ bị chặn
  2. release[]– Phương thức này được sử dụng để giải phóng các ổ khóa khi không còn cần thiết. Nó có thể được gọi bởi bất kỳ trạng thái nào, bất kể trạng thái của họ

Tham số mà chúng ta chuyển qua phương thức got[] của lớp Lock được gọi là tham số chặn

Giả sử chúng ta có một đối tượng luồng T để hiểu cách tất cả những thứ này hoạt động cùng nhau. Như đã đề cập trước đó, nếu chúng ta muốn gọi phương thức thu được [] cho T, chúng ta sẽ chuyển tham số chặn qua nó

Tham số chặn chỉ có thể có hai giá trị có thể - Đúng hoặc Sai. Nó dẫn đến hai kịch bản

  • cảnh 1. Khi tham số chặn được đặt thành True và chúng tôi gọi phương thức thu được là T. có được [chặn = Đúng], đối tượng luồng sẽ có được khóa T. Điều này chỉ có thể xảy ra khi T không có khóa hiện có. Mặt khác, nếu đối tượng luồng T đã bị khóa, lệnh gọi thu được [] sẽ bị tạm dừng và nó đợi cho đến khi T giải phóng khóa. Thời điểm luồng T giải phóng, luồng gọi ngay lập tức khóa lại nó. Chuỗi cuộc gọi sau đó có được khóa đã giải phóng
  • kịch bản 2. Khi tham số chặn được đặt thành Sai và T được mở khóa, nó sẽ khóa và trả về True. Trong khi đó, nếu T đã bị khóa và tham số chặn được đặt thành Sai, thì phương thức thu được không ảnh hưởng đến T. Nó chỉ trả về Sai

Hàng đợi ưu tiên đa luồng

Một đối tượng hàng đợi mới có thể được tạo bằng mô-đun Hàng đợi. Nó có thể chứa một số mặt hàng cụ thể

Bạn có thể sử dụng các phương pháp sau để kiểm soát hàng đợi –

  • get[]– Nó trả về và xóa một mục khỏi hàng đợi
  • put[]– Nó thêm một mục vào hàng đợi
  • qsize[]– Nó trả về số lượng mục hiện có trong hàng đợi
  • trống [] – Nó trả về Đúng hoặc Sai dựa trên việc hàng đợi có trống hay không
  • full[]– Trả về True nếu hàng đợi đầy, ngược lại trả về False

Hãy xem bài viết này để tìm hiểu thêm về Queue trong Python

đối tượng luồng

1. đèn hiệu

  • các luồng. Semaphore là người đầu tiên trong danh sách
  • Nó là một bộ đếm với một số thuộc tính đặc biệt
  • Vì việc đếm là nguyên tử, nên bạn có thể chắc chắn rằng hệ điều hành sẽ không chuyển luồng giữa chừng khi tăng hoặc giảm
  • Bộ đếm được tăng lên khi luồng. phát hành[] được gọi là
  • Bộ đếm bị giảm khi xâu chuỗi. thu được[] được gọi là

2. Thời gian

  • Đối tượng được sử dụng để lên lịch một chức năng được gọi sau một khoảng thời gian nhất định đã trôi qua là luồng. hẹn giờ
  • Timer được bắt đầu bằng cách sử dụng. phương thức bắt đầu[]
  • Hẹn giờ được dừng lại bằng cách sử dụng. phương thức hủy []

3. Rào chắn

  • Đối tượng được sử dụng để giữ đồng bộ nhiều luồng là luồng. rào cản[] đối tượng
  • Bạn cần chỉ định số luồng sẽ được đồng bộ hóa trong khi tạo Rào chắn
  • Các. phương thức wait[] được gọi bởi mỗi luồng trên Rào cản

Ưu điểm của đa luồng trong Python

Đa luồng trong Python có một số lợi thế, làm cho nó trở thành một cách tiếp cận phổ biến. Chúng ta hãy xem xét một số trong số họ -

  • Đa luồng Python cho phép sử dụng tài nguyên hiệu quả vì các luồng chia sẻ không gian dữ liệu và bộ nhớ
  • Đa luồng trong Python cho phép thực hiện đồng thời và song song các tác vụ khác nhau
  • Nó làm giảm mức tiêu thụ thời gian hoặc thời gian phản hồi, do đó làm tăng hiệu suất

Bây giờ bạn đã đi đến phần cuối của hướng dẫn và học thành công đa luồng trong Python là gì. Bây giờ, hãy kết thúc với một số điểm quan trọng

Đa luồng với ví dụ là gì?

Đa luồng là gì? . Ví dụ: trong trình duyệt web, chúng tôi có thể có một luồng xử lý giao diện người dùng và song song, chúng tôi có thể có một luồng khác tìm nạp dữ liệu sẽ được hiển thị. Vì vậy, đa luồng cải thiện khả năng phản hồi của hệ thống. enables us to run multiple threads concurrently. For example in a web browser, we can have one thread which handles the user interface, and in parallel we can have another thread which fetches the data to be displayed. So multithreading improves the responsiveness of a system.

Tại sao đa luồng được sử dụng trong Python?

Đa luồng Python cho phép sử dụng hiệu quả tài nguyên khi các luồng chia sẻ không gian dữ liệu và bộ nhớ . Đa luồng trong Python cho phép thực hiện đồng thời và song song các tác vụ khác nhau.

Có đa luồng trong Python không?

Python không hỗ trợ đa luồng vì Python trên trình thông dịch Cpython không hỗ trợ thực thi đa lõi thực sự thông qua đa luồng. Tuy nhiên, Python không có thư viện luồng. GIL không ngăn luồng.

Đa luồng trong câu hỏi phỏng vấn Python là gì?

Đa luồng về cơ bản được định nghĩa là khả năng của CPU [đơn vị xử lý trung tâm] để xử lý đồng thời nhiều luồng. .
Nó có thể dễ dàng mở rộng cho nhiều bộ xử lý
Nó cung cấp hỗ trợ hành động sắp xảy ra để vượt qua hoặc thất bại tương ứng
Phương pháp chờ/Ngủ có thể được triển khai dễ dàng và rõ ràng hơn

Chủ Đề