Phát hành khóa chủ đề python

Chúng ta sẽ thảo luận về cách sử dụng phương thức khóa “acre[]” trong ví dụ này. Có thể sử dụng phương thức “acquire[]” để khóa. Không thể thực hiện thêm nỗ lực nào để thực hiện điều này cho đến khi khóa được giải phóng sau khi một luồng đã khóa khóa. Có thể sử dụng phương thức “acquire[]” để bảo vệ khóa. Khi một chuỗi đã bảo vệ khóa, không thể thực hiện thêm nỗ lực nào để làm như vậy cho đến khi khóa được giải phóng. Tùy chọn “thời gian chờ” cũng sẽ được sử dụng trong trường hợp này của phương thức “acquire[]” để chỉ định thời gian chuỗi cuộc gọi sẽ bị trì hoãn nếu một thao tác khác đang cố lấy khóa. Nếu giá trị tiềm năng của luồng là 1, tức là 1, luồng sẽ bị trì hoãn vô thời hạn cho đến khi nhận được khóa. Ở đây, chúng tôi đã sử dụng điều này để xác định thời gian một chuỗi sẽ tìm kiếm khóa

Hãy bắt đầu triển khai tập lệnh bằng cách sử dụng công cụ “gián điệp” để triển khai mã. Trước tiên, chúng tôi sẽ nhập khóa và luồng từ thư viện luồng Python. Các luồng được sử dụng trong một quy trình Python để thực hiện mã thực thi. Mỗi chương trình có một luồng theo mặc định nhưng chúng tôi có thể cần tạo nhiều luồng hơn nếu chúng tôi muốn thực hiện đồng thời một số quy trình. Mô-đun ngủ sau đó được nhập. Phương thức “sleep[]” trong mô-đun thời gian Python được sử dụng để tạm dừng thực thi chương trình trong một khoảng thời gian định trước. Điều này cho thấy rằng chương trình tạm thời bị treo trước khi được thực thi tự động sau một khoảng thời gian định trước. Tiếp theo, phương thức “lock[]” được sử dụng. Sau đó, trong dòng tiếp theo, chúng ta định nghĩa một hàm có tên là “func1” và chuyển biến “lock” trong ngoặc đơn của nó

Câu lệnh “nếu” cho phép thực thi một câu lệnh hoặc tập hợp các câu lệnh trong các trường hợp cụ thể dựa trên kết quả của một biểu thức. Chúng ta sử dụng phương thức “acquire[]” trên đối tượng lock bên trong điều kiện “if” để thread liên tục đợi lock. Chúng tôi chuyển thời gian chờ làm một trong các tham số của nó và đặt nó thành “10” trong dấu ngoặc đơn của hàm “acquire[]”. Bây giờ, nếu câu lệnh thỏa mãn yêu cầu, chúng ta sử dụng hàm “print[]”, chuyển câu lệnh “Chủ đề 2. done” trong ngoặc đơn, sau đó chúng ta gọi phương thức release[] trên mô-đun đối tượng khóa. Nếu khóa bị khóa, quá trình này sẽ phản ứng sau khi hoàn nguyên về trạng thái không khóa

Ngoài ra, phương thức này có thể được gọi bởi bất kỳ luồng nào. Nó được phép cho một trong những chủ đề đang chờ để có được quyền giữ cho đến khi chức năng này được gọi. Bây giờ chúng ta in câu lệnh “Chủ đề 1. timeout” nếu điều kiện không được đáp ứng. Bây giờ chúng ta sẽ xây dựng một chức năng mới với tên “func” và khóa tham số ở dòng sau. Sau đó, sử dụng đối tượng lock, chúng ta thực thi phương thức “acquire[]”. Trong dòng tiếp theo, chúng ta gọi hàm “print[]” và cung cấp câu lệnh “Chủ đề 1. done” trước khi sử dụng phương thức “release[]” với khóa

Bây giờ chúng ta sẽ tạo một luồng và gọi các phương thức của luồng bằng cách gọi đối tượng luồng. Chúng tôi đã sử dụng một chuỗi và đặt “mục tiêu = func” bên trong chuỗi đó, chuyển đối số “khóa”,. Sau đó, chúng tôi đã lưu chủ đề này trong một biến có tên là “thread1. ” Trong dòng tiếp theo, chúng tôi đã gọi “func1” bằng luồng và chuyển đối số “khóa” bằng cách sử dụng “thread1. start[]” để bắt đầu chuỗi. Chúng tôi đã làm tương tự cho thread2. Phương thức “join[]” sau đó được sử dụng để chờ thực thi luồng. Vì vậy, chúng ta có hai luồng, mỗi luồng gọi hai thủ tục riêng biệt. Thời gian chờ cho luồng thứ hai là “10” giây, trong khi luồng đầu tiên hoạt động trong “2” giây

Màn hình đầu ra hiện cho thấy luồng 1 được thực hiện trước vì nó được tạo trước và có thể truy cập vào khóa và hoàn tất quá trình thực hiện. Chủ đề 2 đã kết thúc vì thời gian chờ được đặt thành “10” giây, như có thể thấy

Ví dụ #2. Sử dụng Khóa chủ đề của Python trong Điều kiện cuộc đua

Chúng tôi sẽ sử dụng khóa chuỗi Python trong điều kiện chủng tộc trong ví dụ này. Một điều kiện tương tranh xảy ra khi hai luồng nhìn vào một biến được chia sẻ cùng một lúc. Chủ đề ban đầu và thứ hai nhận được cùng một kết quả từ hằng số của chủ đề ban đầu. Sau đó, hai luồng cố gắng thay đổi giá trị chung của biến phụ thuộc. Dữ liệu từ chuỗi bổ sung vào danh sách biến dùng chung được duy trì vì nó xóa giá trị mà chuỗi trước đó đã ghi

Hãy bắt đầu triển khai mã. Trong dòng đầu tiên, chúng tôi nhập mô-đun khóa từ mô-đun luồng. Và trong dòng tiếp theo, chúng tôi nhập mô-đun thời gian. Sau đó, chúng tôi tạo một biến và đặt cho nó giá trị “20”. Trong dòng tiếp theo, chúng ta tạo một hàm có tên là “func1” và chuyển hai biến “increment” và “lock” làm tham số của nó. Chúng tôi tạo một biến toàn cục có tên là “a” và khóa nó

Cuối cùng, trong dòng tiếp theo, chúng ta tạo một biến có tên là “local_counter” và chuyển nó vào đó. Giá trị của "bộ đếm cục bộ" này được tăng lên trong dòng tiếp theo tùy thuộc vào chuỗi nào kết thúc cuối cùng. Sau đó, chúng tôi gọi là “thời gian. sleep[]” và cung cấp khoảng thời gian là “0. 5” giây ở dòng sau. Phương thức “print[]” sau đó được thực thi và bộ đếm cục bộ được lưu trong biến “a”. Trong chức năng này, luồng hiện tại được gọi bằng cách sử dụng “luồng. current_thread[]. tên tăng dần theo số gia” và chuyển “a” trong đó giá trị được lưu trữ và phương thức “phát hành []” có khóa được gọi trong dòng sau. Trong dòng tiếp theo, chúng ta chuyển phương thức lock[]

Bây giờ, chúng ta sẽ tạo hai luồng và gọi hàm bằng cách sử dụng các luồng. Chúng tôi gọi hàm trong luồng đầu tiên bằng cách sử dụng luồng. luồng, đã sử dụng “đích=func1” và chuyển đối số “15” làm số gia và “khóa”. Chúng tôi đã lưu luồng đầu tiên này trong biến “t1” và sau đó chúng tôi lặp lại quy trình tương tự cho luồng 2 nhưng chúng tôi chuyển đối số là số gia của “5” và “lock”. Sau đó, chúng tôi sử dụng “chủ đề. start[]” để bắt đầu thread và “join[]” để đợi thread chạy xong. Giá trị cuối cùng sau đó sẽ được hiển thị

Bây giờ, chỉ cần đặt mã này khiến cả hai luồng đọc giá trị mà chúng tôi đã chia sẻ. “t1″ và “t2” sẽ cố gắng thay đổi giá trị của “a” trong hàm gia tăng bằng cách sử dụng các giá trị gia tăng “15” và “5” được cung cấp trong bộ thông số

Bây giờ, nó hiển thị kết quả cuối cùng “40” ở đầu ra. Vì chúng ta có “a=20” trong đoạn mã trên, khi “luồng 1” tăng thêm “15”, kết quả là “35” và giá trị thay đổi thành “35”. Tuy nhiên, khi “luồng 2” tăng thêm “5”

Phần kết luận

Chức năng khóa chuỗi Python có hai phương thức. có được [] và phát hành [] được đề cập trong bài viết này. Hai ví dụ được trình bày trong hướng dẫn này. Trong trường hợp đầu tiên, chúng tôi đã sử dụng thời gian chờ trong khóa thu thập [] và trong ví dụ thứ hai, chúng tôi đã sử dụng điều kiện chủng tộc bằng cách sử dụng khóa python [] để chỉ ra cách nó tác động đến cách các luồng hoạt động. Chúng tôi dự đoán rằng bạn sẽ thấy những trường hợp này hữu ích khi bạn sử dụng khóa chuỗi Python

Mua và phát hành trong Python là gì?

Nó có hai phương thức cơ bản, thu được[] và phát hành[]. Khi trạng thái được mở khóa, thu được [] sẽ thay đổi trạng thái thành bị khóa và quay lại ngay lập tức. Khi trạng thái bị khóa, thu thập [] sẽ chặn cho đến khi lệnh gọi giải phóng [] trong một coroutine khác thay đổi nó thành mở khóa, sau đó lệnh gọi thu được [] đặt lại thành bị khóa và trả về

Bản phát hành [] Python là gì?

được sử dụng để giải phóng khóa thu được . Nếu khóa bị khóa, phương pháp này sẽ đặt lại thành không khóa và quay lại. Ngoài ra, phương thức này có thể được gọi từ bất kỳ luồng nào. Khi phương thức này được gọi, một trong số các luồng đang đợi để lấy khóa được phép giữ khóa.

Khóa có bị chặn không?

acrec cho phép một chuỗi có quyền sở hữu khóa. Nếu một luồng cố lấy một khóa hiện đang được sở hữu bởi một luồng khác, luồng đó sẽ chặn cho đến khi luồng kia giải phóng khóa . Tại thời điểm đó, nó sẽ tranh chấp với bất kỳ luồng nào khác đang cố lấy khóa.

Hai chủ đề có thể có được cùng một khóa không?

Thông thường, chuỗi không thể khóa hai lần liên tiếp . một luồng phải giải phóng một khóa đã lấy trước khi cố lấy lại nó. Tuy nhiên, khóa reentrant có thể được lấy nhiều lần bởi cùng một luồng. Khóa reentrant cho phép mã lấy khóa trước khi gọi các chức năng khác có cùng khóa.

Chủ Đề