Có phải Python chỉ sử dụng một lõi CPU không?

Python, được mặc định, sẽ chỉ sử dụng một lõi CPU duy nhất tại một thời điểm. Tất cả các hướng dẫn trong mã của bạn được chạy lần lượt, nối tiếp, trên một lõi CPU của bạn. Điều này khiến tất cả các lõi khác ngồi đó không làm gì cả

Anthony Scott

Ngày 17 tháng 3 năm 2020 6 phút đọc

Chưa bao giờ thử lập trình song song trước đây?

Giới thiệu

CPU hiện đại có nhiều lõi vật lý trên một chip. Bốn, sáu và tám lõi vật lý đang trở nên cực kỳ phổ biến trên các CPU tiêu dùng. Thế hệ CPU Intel Xeon hiện tại được tìm thấy trong phần cứng cấp doanh nghiệp có thể có tới 28 lõi vật lý trên mỗi CPU

Ngoài ra, nếu CPU hỗ trợ siêu phân luồng, mỗi lõi có thể xử lý đồng thời hai tác vụ. Do đó, CPU 6 nhân với siêu phân luồng có thể được xem là có 12 nhân ảo, tất cả đều có thể được sử dụng độc lập

CPU Intel Core i7 - 8700k với 6 nhân vật lý

Python, được mặc định, sẽ chỉ sử dụng một lõi CPU duy nhất tại một thời điểm. Tất cả các hướng dẫn trong mã của bạn được chạy lần lượt, nối tiếp, trên một lõi CPU của bạn. Điều này khiến tất cả các lõi khác ngồi đó không làm gì cả [tốt. không có gì, họ đang xử lý những thứ khác trên hệ thống của bạn chứ không phải mã của bạn và đó là tất cả những gì chúng tôi thực sự quan tâm]

Hình minh họa dưới đây cho thấy một ví dụ đơn giản về việc tạo 4 chuỗi ngẫu nhiên. Trong serial [trên cùng], hàm rand_string[] được gọi 4 lần liên tiếp để tạo ra 4 chuỗi ngẫu nhiên. Điều này cũng có thể được thực hiện song song [phía dưới] bằng cách có 4 lõi CPU, mỗi lõi gọi rand_string[] một lần và tất cả cùng một lúc. Về mặt lý thuyết, điều này sẽ tăng tốc độ tính toán gấp 4 lần

Tín dụng hình ảnh. https. // sebastian raschka. com/

Ghi chú. trong ví dụ đơn giản này, tính toán sẽ không được tăng tốc. Nhiều khả năng sẽ mất nhiều thời gian hơn để thực hiện điều này song song bằng python. Đó là bởi vì có một số chi phí phát sinh khi khởi chạy các tác vụ song song. Tuy nhiên, nếu tải tính toán của bạn đủ lớn, điều này sẽ tăng tốc độ tính toán của bạn gấp 4 lần*

Python chứa một số mô-đun trong thư viện tiêu chuẩn cho phép bạn thực hiện các tác vụ song song. Tuy nhiên, nó không hoàn toàn đơn giản như chỉ cần nhập thư viện và nói đi. Bạn phải suy nghĩ về cách mã của bạn hoạt động hơi khác một chút. Và tất nhiên, không phải nhiệm vụ nào cũng có thể thực hiện song song

Ở mức rất cao, Python cho phép bạn xử lý song song theo hai cách khác nhau

  1. Chủ đề - Đa luồng
  2. Quy trình - Đa xử lý

Mỗi cái đều có ưu và nhược điểm riêng và các trường hợp sử dụng phù hợp

Chủ đề Python vs Quy trình

Python cung cấp cả luồng và mô-đun để xử lý các tác vụ đồng thời [đồng thời]

Từ cấp độ cao, các mô hình này gần như giống hệt nhau và dường như cung cấp chức năng giống hệt nhau. Bạn có thể sử dụng cả hai cạnh nhau và từ bàn phím, có vẻ như cả hai đều hoạt động giống hệt nhau. Tuy nhiên, việc hiểu các mô-đun này hoạt động khác nhau như thế nào là cực kỳ quan trọng để đảm bảo mã của bạn đang thực thi hiệu quả nhất có thể

Phần này sẽ đề cập đến một số điểm khác biệt chính giữa hai

Sự khác biệt trong việc sử dụng CPU

Phần này đến trước vì nó có lẽ là phần quan trọng nhất. Đa luồng trong python sẽ CHỈ sử dụng 1 lõi CPU. Bạn có thể tạo và thực thi bao nhiêu luồng tùy thích trong chương trình của mình, nhưng bạn sẽ không bao giờ sử dụng nhiều hơn 1 lõi CPU cùng một lúc

Tại sao lại thế này? . Nó chỉ trông và hành động như nó. Điều đang thực sự xảy ra là CPU đang nhanh chóng chuyển đổi giữa các luồng. Điều này phải xảy ra do Khóa phiên dịch toàn cầu khét tiếng [GIL] của Python. Bạn có thể đọc tất cả về nó ở đây và. Nói tóm lại, GIL chỉ cho phép một luồng thực thi mã python tại một thời điểm. Tuy nhiên, GIL được giải phóng trong các thao tác nhập/xuất [I/O] [điều quan trọng cần lưu ý sau này] và có thể được giải phóng bởi các gói thực thi mã C trực tiếp [e. g. cục mịch]

Python đồng thời sử dụng luồng. Tín dụng. Hackernoon
Python đồng thời sử dụng các quy trình. Tín dụng. Hackernoon

Việc triển khai Python tiêu chuẩn đó được viết bằng C [CPython] và được phát hành lần đầu tiên vào năm 1990 trước kỷ nguyên của CPU đa lõi hiện đại. Ngoài ra, việc quản lý bộ nhớ của tất cả các mô-đun được sử dụng CPython không nhất thiết phải an toàn cho luồng nên GIL được tạo để đảm bảo an toàn cho luồng trong toàn bộ ngôn ngữ Python. GIL được coi là giải pháp hiệu quả nhất vào thời điểm đó [và vẫn còn cho đến ngày nay] trong trường hợp hoạt động đơn lẻ, đó là cách sử dụng tiêu chuẩn của Python lúc bấy giờ và bây giờ

Nhưng tại sao GIL vẫn tồn tại sau 30 năm?

Giải pháp xử lý song song thực sự trong Python đến từ thư viện đa xử lý. Sử dụng thư viện này để giải quyết GIL bằng cách tạo ra một quy trình hệ thống hoàn toàn độc lập với trình thông dịch Python của chính nó. Với điều này đi kèm với chi phí;

Điều này có nghĩa là không chỉ đa xử lý bị giới hạn bởi số lượng CPU bạn có. Bạn cũng phải có đủ bộ nhớ để chứa các bản sao của bộ nhớ

Sự khác biệt trong quản lý bộ nhớ

Điều này dẫn đến một cuộc thảo luận về sự khác biệt quan trọng thứ hai giữa luồng và quy trình Python. Cách họ sử dụng bộ nhớ

Tất cả các luồng đều chia sẻ bộ nhớ chung với tiến trình cha của chúng. Cái này tốt ở chỗ. Họ không cần tạo một bản sao của đối tượng cho mỗi luồng và họ có thể dễ dàng giao tiếp với nhau thông qua dữ liệu được chia sẻ. Nhưng thận trọng. rất dễ tạo ra các điều kiện chạy đua trong đó hai luồng cố gắng truy cập hoặc sửa đổi cùng một đối tượng bộ nhớ đồng thời

Mỗi quy trình chứa một bản sao của không gian bộ nhớ cha mẹ. Điều này có nghĩa là không phải lo lắng về việc một tiến trình sửa đổi một phần bộ nhớ trong khi tiến trình kia đang cố đọc nó. Nhưng nó cũng khiến việc chia sẻ dữ liệu giữa các quy trình trở nên khó khăn hơn

Luồng Python sử dụng không gian bộ nhớ dùng chung. Tín dụng. tổng cộng. io
Các quy trình Python nhận các bản sao độc lập của không gian bộ nhớ gốc. Tín dụngL Toptal. io

Tuy nhiên, Python cung cấp một số mô-đun bên ngoài cung cấp các cơ chế an toàn cho luồng để chia sẻ dữ liệu giữa các luồng và quy trình. hàng đợi. Điều gì sẽ được chứng minh trong các ví dụ

Tôi nên sử dụng Chủ đề hay Quy trình

Cách dễ nhất để xác định bạn nên sử dụng phương pháp nào là xem chương trình của bạn và quyết định. sự cố của tôi là sự cố liên quan đến CPU hay sự cố liên quan đến I/O. Nói cách khác, chương trình của tôi dành phần lớn thời gian để tính toán hay dành phần lớn thời gian để chờ I/O [đọc/ghi vào đĩa, giao tiếp qua mạng, v.v.]

Nếu chương trình của bạn bị ràng buộc I/O, việc sử dụng các luồng sẽ tăng tốc độ chương trình, bởi vì I/O xảy ra bên ngoài GIL

Chương trình ràng buộc I/O ‌‌ . Tín dụng RealPython
Tăng tốc sự cố liên quan đến I/O bằng các luồng. Tín dụng. RealPython

Nếu chương trình của bạn bị ràng buộc bởi CPU. Các luồng sẽ không tăng tốc độ, vì hãy nhớ rằng, CPU chỉ chuyển đổi qua lại giữa các luồng. Tuy nhiên, sử dụng Processe, bạn có thể tăng tốc đáng kể các chương trình gắn với CPU

Chương trình ràng buộc CPU. Tín dụng. RealPython
Tăng tốc sự cố liên quan đến CPU bằng Quy trình. Tín dụng. Các ví dụ về lập trình RealPython

Xem đầu ra và sự khác biệt trong thời gian chạy là rất hữu ích khi thử nghiệm với các mô-đun Python này. Vì vậy, nếu bạn muốn xem một số bản trình diễn mã, vui lòng xem Sổ tay Jupyter của tôi trên GitHub, trong đó có một vài ví dụ hoạt động. https. //github. com/canthonyscott/Into_to_parallel_programming_Python

Python sử dụng bao nhiêu CPU?

Trong trường hợp này, có 8 lõi CPU logic . Hệ thống của tôi có siêu phân luồng, nghĩa là có 4 lõi CPU vật lý.

Có bao nhiêu CPU hoặc lõi sẽ phân luồng Python?

Thư viện luồng Python sẽ tận dụng đồng thời bao nhiêu CPU [hoặc lõi]? . Thư viện đa xử lý sẽ cho phép bạn chạy mã trên các bộ xử lý khác nhau. Luồng Python bị giới hạn ở một CPU duy nhất tại một thời điểm. Python threading is restricted to a single CPU at one time. The multiprocessing library will allow you to run code on different processors. Python threading is restricted to a single CPU at one time.

Có phải 1 CPU có nghĩa là 1 lõi?

Lõi CPU là bộ xử lý [mở trong tab mới] của CPU . Ngày xưa, mỗi bộ xử lý chỉ có một lõi có thể tập trung vào một tác vụ tại một thời điểm. Ngày nay, CPU [opens in new tab] đã có hai nhân và 18 nhân, mỗi nhân có thể đảm nhận một nhiệm vụ khác nhau.

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.

Chủ Đề