Đồng tiền trong Python - Giới thiệu
Trong chương này, chúng ta sẽ hiểu khái niệm đồng thời trong Python và tìm hiểu về các luồng và quy trình khác nhau.
Concurrency là gì?
Nói một cách dễ hiểu, đồng thời là sự xuất hiện của hai hoặc nhiều sự kiện cùng một lúc. Đồng thời là một hiện tượng tự nhiên vì nhiều sự kiện xảy ra đồng thời tại bất kỳ thời điểm nào.
Về mặt lập trình, đồng thời là khi hai tác vụ chồng chéo lên nhau trong quá trình thực thi. Với lập trình đồng thời, hiệu suất của các ứng dụng và hệ thống phần mềm của chúng tôi có thể được cải thiện vì chúng tôi có thể đồng thời giải quyết các yêu cầu thay vì chờ đợi một yêu cầu trước đó được hoàn thành.
Đánh giá lịch sử của đồng tiền
Những điểm sau đây sẽ cung cấp cho chúng ta đánh giá lịch sử ngắn gọn về đồng thời -
Từ khái niệm đường sắt
Đồng thời có quan hệ mật thiết với khái niệm đường sắt. Với đường sắt, cần phải xử lý nhiều đoàn tàu trên cùng một hệ thống đường sắt theo cách mà mọi đoàn tàu đều đến đích một cách an toàn.
Tính toán đồng thời trong học viện
Mối quan tâm đến đồng thời trong khoa học máy tính bắt đầu từ bài báo nghiên cứu được xuất bản bởi Edsger W. Dijkstra vào năm 1965. Trong bài báo này, ông đã xác định và giải quyết vấn đề loại trừ lẫn nhau, tính chất của điều khiển đồng thời.
Nguyên thủy đồng thời cấp cao
Trong thời gian gần đây, các lập trình viên đang nhận được các giải pháp đồng thời được cải thiện vì sự ra đời của các nguyên mẫu đồng thời cấp cao.
Cải thiện tính đồng thời với các ngôn ngữ lập trình
Các ngôn ngữ lập trình như Golang, Rust và Python của Google đã có những bước phát triển đáng kinh ngạc trong các lĩnh vực giúp chúng tôi có được các giải pháp đồng thời tốt hơn.
Luồng & đa luồng là gì?
Threadlà đơn vị thực thi nhỏ nhất có thể được thực hiện trong một hệ điều hành. Bản thân nó không phải là một chương trình mà chạy trong một chương trình. Nói cách khác, các chủ đề không độc lập với nhau. Mỗi luồng chia sẻ phần mã, phần dữ liệu, v.v. với các luồng khác. Chúng còn được gọi là các quy trình nhẹ.
Một chuỗi bao gồm các thành phần sau:
Bộ đếm chương trình bao gồm địa chỉ của lệnh thực thi tiếp theo
Stack
Tập hợp các thanh ghi
Một id duy nhất
MultithreadingMặt khác, là khả năng của CPU quản lý việc sử dụng hệ điều hành bằng cách thực thi nhiều luồng đồng thời. Ý tưởng chính của đa luồng là đạt được sự song song bằng cách chia một quy trình thành nhiều luồng. Khái niệm đa luồng có thể được hiểu với sự trợ giúp của ví dụ sau.
Thí dụ
Giả sử chúng ta đang chạy một quy trình cụ thể, trong đó chúng ta mở MS Word để nhập nội dung vào đó. Một chuỗi sẽ được chỉ định để mở MS Word và một chuỗi khác sẽ được yêu cầu để nhập nội dung vào đó. Và bây giờ, nếu chúng ta muốn chỉnh sửa hiện có thì một luồng khác sẽ được yêu cầu để thực hiện tác vụ chỉnh sửa, v.v.
Quy trình & đa quy trình là gì?
Aprocessđược định nghĩa là một thực thể, đại diện cho đơn vị công việc cơ bản được thực hiện trong hệ thống. Nói một cách dễ hiểu, chúng ta viết các chương trình máy tính của mình trong một tệp văn bản và khi chúng ta thực thi chương trình này, nó sẽ trở thành một quá trình thực hiện tất cả các tác vụ được đề cập trong chương trình. Trong suốt vòng đời của quy trình, nó trải qua các giai đoạn khác nhau - Bắt đầu, Sẵn sàng, Chạy, Chờ đợi và Kết thúc.
Sơ đồ sau đây cho thấy các giai đoạn khác nhau của một quy trình:
Một tiến trình có thể chỉ có một luồng, được gọi là luồng chính, hoặc nhiều luồng có bộ thanh ghi, bộ đếm chương trình và ngăn xếp riêng của chúng. Sơ đồ sau sẽ cho chúng ta thấy sự khác biệt -
Multiprocessing,mặt khác, là việc sử dụng hai hoặc nhiều đơn vị CPU trong một hệ thống máy tính duy nhất. Mục tiêu chính của chúng tôi là khai thác toàn bộ tiềm năng từ phần cứng của mình. Để đạt được điều này, chúng ta cần sử dụng đầy đủ số lõi CPU có sẵn trong hệ thống máy tính của mình. Đa xử lý là cách tốt nhất để làm như vậy.
Python là một trong những ngôn ngữ lập trình phổ biến nhất. Sau đây là một số lý do khiến nó phù hợp với các ứng dụng đồng thời -
Cú pháp đặc biệt
Đường cú pháp là cú pháp trong một ngôn ngữ lập trình được thiết kế để giúp mọi thứ dễ đọc hoặc dễ diễn đạt hơn. Nó làm cho ngôn ngữ trở nên “ngọt ngào hơn” đối với con người: mọi thứ có thể được diễn đạt rõ ràng hơn, ngắn gọn hơn hoặc theo một phong cách khác dựa trên sở thích. Python đi kèm với các phương thức Magic, có thể được định nghĩa để hoạt động trên các đối tượng. Các phương pháp Magic này được sử dụng như một đường cú pháp và gắn với các từ khóa dễ hiểu hơn.
Cộng đồng lớn
Ngôn ngữ Python đã chứng kiến một tỷ lệ chấp nhận lớn giữa các nhà khoa học dữ liệu và toán học, làm việc trong lĩnh vực AI, học máy, học sâu và phân tích định lượng.
Các API hữu ích để lập trình đồng thời
Python 2 và 3 có số lượng lớn các API dành riêng cho lập trình song song / đồng thời. Phổ biến nhất trong số họ làthreading, concurrent.features, multiprocessing, asyncio, gevent and greenlets, Vân vân.
Hạn chế của Python trong việc triển khai các ứng dụng đồng thời
Python đi kèm với một giới hạn cho các ứng dụng đồng thời. Hạn chế này được gọi làGIL (Global Interpreter Lock)có mặt trong Python. GIL không bao giờ cho phép chúng tôi sử dụng nhiều lõi của CPU và do đó chúng tôi có thể nói rằng không có luồng thực sự trong Python. Chúng ta có thể hiểu khái niệm GIL như sau:
GIL (Khóa thông dịch viên toàn cầu)
Nó là một trong những chủ đề gây tranh cãi nhất trong thế giới Python. Trong CPython, GIL là mutex - khóa loại trừ lẫn nhau, giúp mọi thứ an toàn. Nói cách khác, chúng ta có thể nói rằng GIL ngăn nhiều luồng thực thi mã Python song song. Khóa chỉ có thể được giữ bởi một luồng tại một thời điểm và nếu chúng ta muốn thực thi một luồng thì trước tiên nó phải có được khóa. Sơ đồ dưới đây sẽ giúp bạn hiểu hoạt động của GIL.
Tuy nhiên, có một số thư viện và triển khai trong Python như Numpy, Jpython và IronPytbhon. Các thư viện này hoạt động mà không có bất kỳ tương tác nào với GIL.