Thể loại
Tất cả

boxhoidap.com

Hỏi đáp

10966

10966

8

Python xử lý đồng thời như thế nào?

Trong bài viết này, trước tiên tôi sẽ hướng dẫn bạn về sự khác biệt giữa lập trình đồng thời và thực thi song song, thảo luận về các cơ chế lập trình đồng thời tích hợp sẵn trong Python và những cạm bẫy của đa luồng trong Python

  • Hiểu về lập trình đồng thời so với thực thi song song
  • Tích hợp sẵn Python
  • Đa luồng — Song song dựa trên luồng
  • Đa xử lý — Song song dựa trên quy trình
  • Sự kết luận
  • Python quản lý đồng thời như thế nào?
  • Luồng Python song song hay đồng thời?
  • Python có thực sự đa luồng không?
  • Python xử lý nhiều luồng như thế nào?

Hiểu về lập trình đồng thời so với thực thi song song

Lập trình đồng thời không tương đương với thực thi song song, mặc dù thực tế là hai thuật ngữ này thường được sử dụng thay thế cho nhau

image

Minh họa đồng thời mà không song song

Đồng thời là thuộc tính mà nhiều hoạt động có thể chạy đồng thời nhưng điều đó không có nghĩa là nó sẽ. (Hãy tưởng tượng nếu bộ xử lý của bạn là đơn luồng. )

image

Minh họa song song

Song song là một thuộc tính mà các hoạt động đang thực sự được chạy đồng thời. Nó thường được xác định bởi các ràng buộc phần cứng

Hãy coi chương trình của bạn như một chuỗi thức ăn nhanh, đồng thời được kết hợp khi hai bộ đếm riêng biệt để đặt hàng và thu tiền được xây dựng. Tuy nhiên, nó không đảm bảo tính song song vì nó phụ thuộc vào số lượng nhân viên có sẵn. Nếu chỉ có một nhân viên xử lý cả yêu cầu đặt hàng và thu tiền, các hoạt động không thể chạy song song. Tính song song chỉ xuất hiện khi có hai nhân viên phục vụ đồng thời gọi món và thu tiền

Tích hợp sẵn Python

Bây giờ, chúng ta có gì trong Python?

Trong cuộc thảo luận sau đây, chúng tôi giả định rằng tất cả các chương trình của chúng tôi đều được viết và chạy trong bộ xử lý đa luồng hoặc đa lõi

Câu trả lời là Jein (Có và Không bằng tiếng Đức). Tại sao có? . Bạn có thể nghĩ, vì Python hỗ trợ cả hai, tại sao lại là Jein?

Đa luồng — Song song dựa trên luồng

threading là gói cung cấp API để tạo và quản lý luồng. Các luồng trong Python luôn không xác định và việc lập lịch trình của chúng được thực hiện bởi hệ điều hành. Tuy nhiên, đa luồng có thể không hoạt động như bạn mong đợi

Tại sao đa luồng trong Python có thể không phải là điều bạn muốn?

Khác với những cạm bẫy phổ biến như bế tắc, chết đói trong đa luồng nói chung. Python nổi tiếng với hiệu suất kém trong đa luồng

Chúng ta hãy xem đoạn trích sau

nhập luồng

đếm ngược def(). x = 1000000000trong khi x > 0. x -= 1

# Thực hiện 1. Triển khai đa luồngdef_1(). luồng_1 = luồng. Chủ đề(mục tiêu=đếm ngược)thread_2 = phân luồng. Chủ đề (mục tiêu = đếm ngược) chủ đề_1. bắt đầu() chủ đề_2. bắt đầu() chủ đề_1. tham gia () chủ đề_2. tham gia()

# Thực hiện 2. Chạy trong triển khai serialdef_2(). đếm ngược() đếm ngược()

Việc triển khai nào sẽ nhanh hơn?

image

Kết quả thời gian của cả hai lần triển khai

Ngạc nhiên thay, chạy 2 countdown() nối tiếp hoạt động tốt hơn đa luồng?

Khóa phiên dịch toàn cầu (GIL) là gì?

Phụ thuộc vào việc phân phối Python của bạn, trong hầu hết các trường hợp, là một triển khai của CPython. CPython là triển khai ban đầu của Python, bạn có thể đọc thêm về nó trong chuỗi StackOverflow này

Trong CPython, đa luồng được hỗ trợ bằng cách giới thiệu Mutex được gọi là Khóa phiên dịch toàn cầu (còn gọi là GIL). Đó là để ngăn nhiều luồng truy cập đồng thời vào cùng một đối tượng Python. Điều này có ý nghĩa, bạn sẽ không muốn người khác thay đổi đối tượng của mình trong khi bạn đang xử lý nó

image

Minh họa Thực hiện_1

Vì vậy, từ đoạn mã của chúng tôi ở trên, implementation_1 tạo 2 luồng và được cho là chạy song song trên hệ thống đa luồng. Tuy nhiên, tại một thời điểm chỉ có một luồng có thể giữ GIL, một luồng phải đợi luồng khác giải phóng GIL trước khi chạy. Trong khi đó, việc lập lịch trình và chuyển đổi được thực hiện bởi HĐH giới thiệu chi phí hoạt động khiến cho implementation_1 thậm chí còn chậm hơn

Làm cách nào để vượt qua GIL?

Làm thế nào chúng ta có thể bỏ qua GIL, trong khi vẫn duy trì việc sử dụng đa luồng?

Sử dụng một triển khai Python khác như Jython, PyPy hoặc IronPython là một tùy chọn. Cá nhân tôi không ủng hộ việc sử dụng một triển khai Python khác vì hầu hết các thư viện được viết không được kiểm tra đối với các triển khai Python khác nhau

Một cách giải quyết tiềm năng khác là sử dụng C-extenstion, hay còn gọi là Cython. Lưu ý rằng Cython và CPython không giống nhau. Bạn có thể đọc thêm về Cython tại đây

Sử dụng đa xử lý thay thế. Vì trong đa xử lý, một trình thông dịch được tạo cho mọi tiến trình con. Không tồn tại tình trạng các luồng tranh giành GIL đơn giản vì luôn chỉ có một luồng chính trong mọi quy trình

Bất chấp tất cả những cạm bẫy, chúng ta vẫn nên sử dụng đa luồng chứ?

Nếu tác vụ của bạn bị ràng buộc I/O, nghĩa là luồng dành phần lớn thời gian để xử lý I/O, chẳng hạn như thực hiện các yêu cầu mạng. Việc sử dụng đa luồng vẫn hoàn toàn ổn vì hầu hết thời gian, luồng bị hệ điều hành chặn và đưa vào hàng đợi bị chặn. Thread cũng luôn ít ngốn tài nguyên hơn process

Đa xử lý — Song song dựa trên quy trình

Hãy để chúng tôi triển khai đoạn mã trước đó bằng cách sử dụng đa xử lý

nhập đa xử lý

# đếm ngược() được xác định trong đoạn mã trước

xác định thực hiện 3(). process_1 = đa xử lý. Quá trình(mục tiêu=đếm ngược) process_2 = đa xử lý. Quá trình(đích=đếm ngược)tiến trình_1. bắt đầu() process_2. bắt đầu() quá trình_1. tham gia() process_2. tham gia()

Bản thân kết quả là tự giải thích

image

Kết quả định thời của đa xử lý so với đa luồng

Sự kết luận

Ràng buộc của GIL là thứ đã thu hút tôi ngay từ đầu với tư cách là nhà phát triển Python. Tôi không biết quyết định sử dụng chủ đề của mình là hoàn toàn vô giá trị cho đến khi tôi thực hiện việc tính thời gian. Tôi hy vọng bài viết này sẽ giúp

Python quản lý đồng thời như thế nào?

Nhiều khi các quy trình đồng thời cần truy cập cùng một dữ liệu vào cùng một thời điểm. Một giải pháp khác, ngoài việc sử dụng khóa rõ ràng, là sử dụng cấu trúc dữ liệu hỗ trợ truy cập đồng thời . Ví dụ: chúng ta có thể sử dụng mô-đun hàng đợi, cung cấp hàng đợi an toàn cho luồng. Chúng ta cũng có thể sử dụng đa xử lý.

Luồng Python song song hay đồng thời?

Trên thực tế, một quy trình Python không thể chạy các luồng song song nhưng nó có thể chạy chúng đồng thời thông qua chuyển ngữ cảnh trong các hoạt động liên kết I/O . Hạn chế này thực sự được thi hành bởi GIL. Khóa phiên dịch toàn cầu Python (GIL) ngăn các luồng trong cùng một quy trình được thực thi cùng một lúc.

Python có thực sự đa luồng 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 có thư viện luồng. GIL không ngăn luồng.

Python xử lý nhiều luồng như thế nào?

Để sử dụng đa luồng, chúng ta cần nhập mô-đun luồng trong Chương trình Python . Phương thức start() được sử dụng để bắt đầu hoạt động của một luồng. Và nó chỉ gọi một lần cho mỗi luồng để quá trình thực thi luồng có thể bắt đầu.

Dịch vụ SEO website - Thiết kế Website

★★★★★ 7 đánh giá trên Google
Văn phòng công ty

Địa chỉ: Số 5 Trần Kim Xuyến - P.Trung Hoà - Q.Cầu Giấy - TP. Hả Nội

Điện thoại: 0922 892 892

Trang web: Bangnam.com

Từ Dịch vụ SEO website - Thiết kế Website

"BANGNAM là đơn vị cung cấp Dịch Vụ SEO, Dịch vụ thiết kế Website, Giải pháp quản trị doanh nghiệp ERP hàng đầu tại Việt Nam."

Mọi người cũng tìm kiếm

Thiết kế website Hà Nội
Nhà thiết kế trang web
Thiết kế website bán hàng
Nhà thiết kế trang web
Dịch vụ SEO
Nhà tối ưu công cụ tìm kiếm
Thiết kế website TP HCM
Nhà thiết kế trang web
Thiết kế website Hà Nội
Nhà thiết kế trang web