Chủ đề Python không in

Bài viết này trình bày những kiến ​​thức cơ bản về đa luồng trong ngôn ngữ lập trình Python. Cũng giống như đa xử lý, đa luồng là một cách để đạt được đa nhiệm. Trong đa luồng, khái niệm luồng được sử dụng. Trước tiên chúng ta hãy hiểu khái niệm về luồng trong kiến ​​trúc máy tính

Chủ đề

Trong điện toán, một quy trình là một thể hiện của một chương trình máy tính đang được thực thi. Bất kỳ quy trình nào cũng có 3 thành phần cơ bản

  • Một chương trình thực thi
  • Dữ liệu liên quan mà chương trình cần [biến, không gian làm việc, bộ đệm, v.v. ]
  • Bối cảnh thực thi của chương trình [Trạng thái của tiến trình]

Một luồng là một thực thể trong một quy trình có thể được lên lịch để thực hiện. Ngoài ra, nó là đơn vị xử lý nhỏ nhất có thể được thực hiện trong HĐH [Hệ điều hành]. Nói một cách đơn giản, một luồng là một chuỗi các hướng dẫn như vậy trong một chương trình có thể được thực thi độc lập với mã khác. Để đơn giản, bạn có thể giả sử rằng một luồng chỉ đơn giản là một tập hợp con của một quy trình. Một luồng chứa tất cả thông tin này trong Khối điều khiển luồng [TCB]

  • Số nhận dạng chủ đề. Id duy nhất [TID] được gán cho mỗi chủ đề mới
  • Con trỏ ngăn xếp. Trỏ tới ngăn xếp của luồng trong tiến trình. Ngăn xếp chứa các biến cục bộ trong phạm vi của luồng
  • bộ đếm chương trình. một thanh ghi lưu địa chỉ của lệnh hiện đang được thực thi bởi luồng
  • Trạng thái chủ đề. có thể đang chạy, sẵn sàng, chờ đợi, bắt đầu hoặc hoàn thành
  • Bộ đăng ký của chủ đề. thanh ghi được gán cho luồng để tính toán
  • Con trỏ tiến trình cha. Một con trỏ tới khối Điều khiển quy trình [PCB] của quy trình mà luồng tồn tại trên đó

Xem xét sơ đồ bên dưới để hiểu mối quan hệ giữa quy trình và luồng của nó

đa luồng. Nhiều luồng có thể tồn tại trong một quy trình trong đó

  • Mỗi luồng chứa bộ thanh ghi riêng và các biến cục bộ [được lưu trữ trong ngăn xếp]
  • Tất cả các luồng của một quy trình chia sẻ các biến toàn cục [được lưu trữ trong heap] và mã chương trình

Xem xét sơ đồ bên dưới để hiểu cách tồn tại nhiều luồng trong bộ nhớ

Đa luồng được định nghĩa là khả năng bộ xử lý thực thi đồng thời nhiều luồng

Trong một CPU lõi đơn, đơn giản, nó đạt được bằng cách chuyển đổi thường xuyên giữa các luồng. Điều này được gọi là chuyển ngữ cảnh. Trong chuyển đổi ngữ cảnh, trạng thái của một luồng được lưu và trạng thái của một luồng khác được tải bất cứ khi nào có bất kỳ ngắt nào [do I/O hoặc được đặt thủ công] diễn ra. Chuyển đổi ngữ cảnh diễn ra thường xuyên đến mức tất cả các luồng dường như đang chạy song song [điều này được gọi là đa nhiệm]

Xem xét sơ đồ bên dưới, trong đó một quy trình chứa hai luồng đang hoạt động.  

Đa luồng trong Python

Trong Python, mô-đun luồng cung cấp một API rất đơn giản và trực quan để sinh ra nhiều luồng trong một chương trình. Chúng ta hãy xem xét một ví dụ đơn giản sử dụng mô-đun phân luồng.  

Python3




import threading
72

import threading
73

import threading
0

import threading
1
import threading
2

 

 

import threading
3
import threading
4

import threading
5
import threading
6

import threading
5
import threading
8
import threading
9
import threading
00
import threading
01
import threading
02
import threading
03
import threading
04
import threading
05
import threading
04
import threading
07

 

 

import threading
3
import threading
09

import threading
5
import threading
11

import threading
5
import threading
8
import threading
9
import threading
15
import threading
01
import threading
02
import threading
03
import threading
04
import threading
07

 

 

import threading
11
import threading
12____313
import threading
13
import threading
15
import threading
16

import threading
5
import threading
18

import threading
5
import threading
00
import threading
13
import threading
02
import threading
13
import threading
04
import threading
13
import threading
9
import threading
07
import threading
08

import threading
5
import threading
00
import threading
13
import threading
02
import threading
13
import threading
04
import threading
13
import threading
9
import threading
07
import threading
08

 

import threading
5
import threading
00

import threading
5
import threading
02

import threading
5
import threading
04

import threading
5
import threading
06

 

import threading
5
import threading
08

import threading
5
import threading
720

import threading
5
import threading
722

import threading
5
import threading
724

 

import threading
5
import threading
726

import threading
5
import threading
8____09____1730
import threading
731

import threading
6

Hãy để chúng tôi cố gắng hiểu đoạn mã trên

  • Để nhập mô-đun luồng, chúng tôi làm
import threading
  • Để tạo một luồng mới, chúng ta tạo một đối tượng thuộc lớp Thread. Phải mất các đối số sau
    • Mục tiêu. chức năng được thực thi bởi luồng
    • tranh luận. các đối số được chuyển đến hàm mục tiêu
  • Để bắt đầu một tiểu trình, chúng ta sử dụng phương thức bắt đầu của lớp Thread
import threading
0
  • Khi các luồng bắt đầu, chương trình hiện tại [bạn có thể coi nó giống như một luồng chính] cũng tiếp tục thực thi. Để dừng thực thi chương trình hiện tại cho đến khi hoàn thành một luồng, chúng tôi sử dụng phương thức nối
import threading
1
  • Do đó, chương trình hiện tại trước tiên sẽ đợi hoàn thành t1 và sau đó là t2. Khi chúng kết thúc, các câu lệnh còn lại của chương trình hiện tại được thực hiện

Xem xét sơ đồ bên dưới để hiểu rõ hơn về cách thức hoạt động của chương trình trên.  

Hãy xem xét chương trình python được cung cấp bên dưới, trong đó chúng tôi in tên luồng và quy trình tương ứng cho từng tác vụ.  

Python3




import threading
72

import threading
73

import threading
1
import threading
2

import threading
1
import threading
737

 

import threading
3
import threading
739

import threading
5
import threading
8
import threading
02
import threading
03
import threading
04
import threading
02
import threading
06

import threading
5
import threading
8
import threading
09
import threading
10
import threading
11
import threading
03
import threading
13
import threading
02
import threading
15

 

import threading
3
import threading
17

import threading
5
import threading
8
import threading
02
import threading
21
import threading
04
import threading
02
import threading
06

import threading
5
import threading
8
import threading
09
import threading
10
import threading
11
import threading
21
import threading
13
import threading
02
import threading
15

 

import threading
11
import threading
12____313
import threading
13
import threading
38

 

import threading
5
import threading
40

import threading
5
import threading
8
import threading
09
import threading
10
import threading
45
import threading
02
import threading
15

 

import threading
5
import threading
49

import threading
5
import threading
8
import threading
52
import threading
02
import threading
06

 

import threading
5
import threading
56

import threading
5
import threading
00
import threading
13
import threading
02
import threading
13
import threading
62
import threading
13
import threading
64
import threading
731

import threading
5
import threading
00
import threading
13
import threading
02
import threading
13
import threading
71
import threading
13
import threading
73
import threading
74

 

import threading
5
import threading
76

import threading
5
import threading
02

import threading
5
import threading
06

 

import threading
5
import threading
82

import threading
5
import threading
720

import threading
5
import threading
724

import threading
1

Hãy để chúng tôi cố gắng hiểu đoạn mã trên

  • chúng tôi sử dụng hệ điều hành. hàm getpid[] để lấy ID của quy trình hiện tại
import threading
0
  • Vì rõ ràng từ đầu ra, ID tiến trình vẫn giữ nguyên cho tất cả các luồng
  • Chúng tôi sử dụng luồng. hàm main_thread[] để lấy đối tượng luồng chính. Trong điều kiện bình thường, luồng chính là luồng mà trình thông dịch Python được bắt đầu. thuộc tính tên của đối tượng luồng được sử dụng để lấy tên của luồng
import threading
0
  • Chúng tôi sử dụng luồng. current_thread[] để lấy đối tượng luồng hiện tại
import threading
0

Sơ đồ đưa ra dưới đây làm rõ khái niệm trên

Vì vậy, đây là phần giới thiệu ngắn gọn về đa luồng trong Python. Bài viết tiếp theo trong loạt bài này đề cập đến việc đồng bộ hóa giữa nhiều luồng. Đa luồng trong Python. Bộ 2 [Đồng bộ hóa]

Bài viết này được đóng góp bởi Nikhil Kumar. Nếu bạn thích GeeksforGeeks và muốn đóng góp, bạn cũng có thể viết một bài báo bằng cách sử dụng write. chuyên viên máy tính. org hoặc gửi bài viết của bạn tới review-team@geeksforgeeks. tổ chức. Xem bài viết của bạn xuất hiện trên trang chính của GeeksforGeeks và trợ giúp các Geeks khác

Vui lòng viết bình luận nếu bạn thấy bất cứ điều gì không chính xác hoặc bạn muốn chia sẻ thêm thông tin về chủ đề thảo luận ở trên

Tại sao Python không tốt cho luồ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 .

Python có chờ chủ đề kết thúc không?

Khi chạy chương trình, bạn sẽ nhận thấy rằng có một khoảng dừng [khoảng 2 giây] sau khi __main__ đã in thông báo tất cả đã xong và trước khi luồng kết thúc< . Việc tạm dừng này là Python đang chờ chuỗi không phải daemon hoàn thành. . This pause is Python waiting for the non-daemonic thread to complete.

Là chủ đề in

Ví dụ: chức năng in không an toàn cho luồng

Hạn chế chính của luồng với Python là gì?

Máy ảo Python không phải là trình thông dịch an toàn cho luồng , nghĩa là trình thông dịch chỉ có thể thực thi một luồng tại bất kỳ thời điểm nào. Giới hạn này được thực thi bởi Khóa thông dịch viên toàn cầu Python [GIL], về cơ bản giới hạn một chuỗi Python chạy tại một thời điểm.

Chủ Đề