Mutex khóa tệp Python
Cam kết này không thuộc về bất kỳ nhánh nào trên kho lưu trữ này và có thể thuộc về một nhánh bên ngoài kho lưu trữ Show Bạn không thể thực hiện hành động đó vào lúc này Bạn đã đăng nhập bằng tab hoặc cửa sổ khác. Tải lại để làm mới phiên của bạn. Bạn đã đăng xuất trong một tab hoặc cửa sổ khác. Tải lại để làm mới phiên của bạn mô-đun đa xử lý trong python cung cấp giao diện gọn gàng để bảo vệ tài nguyên dùng chung (tệp, biến) khỏi bị sửa đổi bởi hai hoặc nhiều quy trình đang chạy đồng thời Cái gì trên trái đất là một mutex? . Tôi biết đó không phải là một định nghĩa hay cho người mới bắt đầu, vì vậy hãy để chúng tôi mô tả nó bằng một ví dụ thực tế. Chúng ta có thể ăn bánh trước khi nó được nướng không? . Thông thường, chúng tôi đợi cho đến khi thức ăn được nấu chín rồi mới ăn. Sự tương tự này không xa so với nguyên thủy đồng bộ hóa (ví dụ:. câm). Trong một hệ điều hành hiện đại, thông thường, chúng ta có một ứng dụng (quy trình) với nhiều luồng thực thi hoặc nhiệm vụ con. Chúng tôi muốn các luồng chạy đồng thời mà không can thiệp, nếu không; . Nếu một luồng đang tính toán một giá trị và luồng kia đang chờ tiêu thụ giá trị đó, thì cần phải đồng bộ hóa thích hợp. Ví dụ nổi tiếng là một tài khoản ngân hàng được chia sẻ giữa hai chủ đề. Một luồng gửi tiền vào tài khoản và một luồng khác rút tiền từ tài khoản đó. Nếu hai chủ đề này không được đồng bộ hóa thì tình trạng chạy đua có thể xảy ra và kết quả cuối cùng là mọi người bị sa thải Mutex Python so với khóa Chúng ta nên rất cẩn thận để không nhầm lẫn thuật ngữ với cú pháp ngôn ngữ lập trình. Khóa là một thuật ngữ chung. Đó là một cơ chế để thực hiện loại trừ lẫn nhau để bảo vệ tài nguyên được chia sẻ giữa các quy trình hoặc luồng. Khóa và một mutex thường được sử dụng thay thế cho nhau, tuy nhiên trong Python, mutex là một mô-đun xác định một lớp để cho phép loại trừ lẫn nhau bằng cách lấy và giải phóng một đối tượng khóa. Xin lưu ý rằng lớp này không được dùng nữa (trong Python 3. 0) và nên tránh. Sau này chúng ta sẽ thấy một cú pháp Python thay thế (luồng. Lock) để thực hiện loại trừ lẫn nhau Ví dụ về mutex Python Đưa ra hai luồng thực thi trong đó mỗi luồng có thể chạy trong một khoảng thời gian ngẫu nhiên. Vì các luồng đang chạy đồng thời nên chúng ta không thể kiểm soát luồng nào sẽ chạy trước và luồng nào sẽ chạy tiếp theo. Ngoài ra, chúng tôi muốn luồng đầu tiên kết thúc trước và luồng thứ hai đợi cho đến khi luồng đầu tiên hoàn thành. Hãy để chúng tôi xem cách đảm bảo thứ tự thực hiện bằng cách sử dụng một mutex con trăn1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # Nhập các mô-đun cần thiết nhập luồng, thời gian, random
# Lớp chủ đề đầu tiên. Lưu ý rằng chúng tôi đang kế thừa # từ lớp Chủ đề lớp thread_one(luồng. Chủ đề). # Một luồng có một phương thức chạy cần # được thực hiện def run(self): print ("Chuỗi đầu tiên hiện đang ngủ") thời gian. ngủ(ngẫu nhiên. randint(1, 5)) in("Chuỗi đầu tiên đã kết thúc")
# Lớp chủ đề thứ hai lớp thread_two(luồng. Chủ đề). def run(self): in ("Chuỗi thứ hai hiện đang ngủ") thời gian. ngủ(ngẫu nhiên. randint(1, 5)) in("Chuỗi thứ hai đã kết thúc")
# Xác định hai chủ đề t1 = thread_one() t2 = thread_two()
# Bắt đầu chủ đề t1. bắt đầu() t2. bắt đầu() Vì mỗi luồng ngủ trong một khoảng thời gian ngẫu nhiên, không có gì đảm bảo rằng luồng đầu tiên sẽ kết thúc trước. Nếu điều đó xảy ra, điều này sẽ dẫn đến tình trạng dồn đuổi có thể làm hỏng ứng dụng nếu hai luồng xảy ra thao túng một tài nguyên hoặc biến được chia sẻ Python thực hiện mutex Giải pháp rất đơn giản. Nếu luồng thứ hai kết thúc trước luồng thứ nhất, nó sẽ đợi. Để làm điều đó, chúng tôi khóa luồng thứ hai ngay sau khi nó kết thúc và buộc nó phải đợi. Khi chuỗi đầu tiên hoàn thành, chúng tôi mở khóa hoặc giải phóng chuỗi thứ hai. Đây là mã nguồn sửa đổi con trăn1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 nhập luồng, thời gian, random
# Python tạo mutex my_mutex = phân luồng. Khóa() lớp thread_one(luồng. Chủ đề). def run(self): # Python mutex toàn cầu toàn cầu my_mutex print ("Chuỗi đầu tiên hiện đang ngủ") thời gian. ngủ(ngẫu nhiên. randint(1, 5)) in("Chuỗi đầu tiên đã kết thúc") # Python phát hành mutex. một khi các chủ đề đầu tiên # đã xong, chúng tôi giải phóng khóa my_mutex. phát hành()
lớp thread_two(luồng. Chủ đề). def run(self): # Python mutex toàn cầu toàn cầu my_mutex in ("Chuỗi thứ hai hiện đang ngủ") thời gian. ngủ(ngẫu nhiên. randint(1, 5)) # Có được mutex Python. chủ đề thứ hai phải # để tiếp tục đợi cho đến khi khóa được giải phóng my_mutex. có được() in("Chuỗi thứ hai đã kết thúc")
# Có được mutex Python. luồng chính đang lấy khóa my_mutex. có được() t1 = thread_one() t2 = thread_two() t1. bắt đầu() t2. bắt đầu() Xin lưu ý những điều sau đây
Mutex vs semaphore Semaphores cũng được sử dụng để đồng bộ hóa các luồng thực thi, vậy sự khác biệt giữa một mutex và semaphore là gì? . Một semaphore là một nguyên thủy đồng bộ hóa cấp cao khác. Nó hạn chế số lượng luồng đồng thời đối với tài nguyên được chia sẻ lên đến số lượng tối đa được gọi là số lượng semaphore. Khi một luồng yêu cầu truy cập tài nguyên, bộ đếm semaphore bị giảm. Khi luồng kết thúc, bộ đếm được tăng lên. Theo nghĩa đó, một mutex không là gì ngoài một semaphore nhị phân có nghĩa là chỉ có thể có một luồng tại một thời điểm nhận được mutex. Ví dụ về nhà vệ sinh khi so sánh mutex với semaphores rất phổ biến. Một mutex giống như chìa khóa nhà vệ sinh. Một người tại một thời điểm có thể có chìa khóa và sử dụng nhà vệ sinh. Khi hoàn thành, anh ta đưa chìa khóa cho người xếp hàng tiếp theo. Mặt khác, một semaphore giống như có một số chìa khóa nhà vệ sinh giống hệt nhau cho một số nhà vệ sinh có sẵn. Số lượng phím đại diện cho số lượng semaphore. Số lượng giảm đi bất cứ khi nào mọi người đến. Khi tất cả các nhà vệ sinh đã có người sử dụng, số đếm trở thành 0 nên không ai có thể sử dụng bất kỳ nhà vệ sinh nào. Nếu ai đó rời đi, số lượng sẽ tăng lên và người tiếp theo trong hàng có thể sử dụng phím đó, v.v. Tóm lược
Người giới thiệu Bài viết này không phải là nơi tốt nhất để giải thích chi tiết nguyên lý đồng bộ hóa. Mục tiêu chính là để chứng minh cách sử dụng một mutex trong Python. Để biết thêm thông tin, bạn có thể tham khảo sau đây
Đó là nó cho ngày hôm nay. Vui lòng để lại nhận xét hoặc đặt câu hỏi ở phần bình luận bên dưới. Cảm ơn vì đã đọc Thêm từ trang web của tôi
Thẻ. Ghi chú bài giảng, Python về tác giảMohammed AbualrobKỹ sư phần mềm @ Cisco 6 Bình luận
|