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ữ

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ăn

1

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ăn

1

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

  • Hãy tưởng tượng có một cánh cửa mà luồng thứ hai phải đợi. Ngay trước khi chúng tôi bắt đầu chuỗi, chúng tôi khóa [sử dụng phương thức thu được] mutex [cửa] để chuỗi thứ hai không vào được. Ví dụ: nếu luồng thứ hai chạy trong một giây thì có khả năng luồng đó sẽ không đợi luồng đầu tiên kết thúc [ví dụ:. chủ đề đầu tiên mất 5 giây]. Đó là lý do tại sao chúng tôi khóa cửa trước khi làm bất cứ điều gì [Dòng 28]
  • Chúng tôi đã sử dụng từ khóa toàn cầu [Dòng 8, 19] trong phương thức chạy của mỗi luồng vì mutex của chúng tôi được khai báo là một biến toàn cục và nên được truy cập từ cả hai luồng
  • Sau khi xử lý xong luồng đầu tiên, chúng tôi để luồng thứ hai thoát khỏi cửa bằng cách giải phóng mutex [Dòng 14]
  • Chuỗi thứ hai cố lấy khóa sau khi hoàn thành tất cả công việc [Dòng 24]. Lưu ý rằng câu lệnh in xuất hiện ngay sau câu lệnh thu thập chứ không phải trước đó vì chuỗi đang chờ, nó chưa kết thúc

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

  • Mutex là một nguyên mẫu đồng bộ hóa đơn giản có thể được sử dụng để bảo vệ tài nguyên được chia sẻ trong hệ điều hành đa luồng
  • Để tạo một mutex trong Python, hãy nhập mô-đun luồng và sử dụng cú pháp. mutex = luồng. Khóa[]
  • Sử dụng phương thức thu được để khóa một mutex và ngăn các luồng khác nhập một khối mã hoặc truy cập vào một biến được chia sẻ
  • Sử dụng phương thức phát hành để giải phóng tài nguyên bị khóa và cho phép các luồng khác có quyền truy cập
  • Một mutex có thể được coi là một semaphore nhị phân [count = 1]

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

  • Wikipedia
  • MSDN

Đó 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

  • Tập tin ánh xạ bộ nhớ trong hệ điều hành
  • Wikipedia Tóm tắt API Python
  • Kết nối với MS SQL Server bằng Python trên máy Mac
  • Cách làm đẹp và in đẹp định dạng JSON trong Python
  • Ví dụ hàm đệ quy Python
  • Ví dụ Python về API Yelp Fusion

Thẻ. Ghi chú bài giảng, Python

về tác giả

Mohammed Abualrob

Kỹ sư phần mềm @ Cisco

6 Bình luận

  1. cái nôi

    Cảm ơn bạn, bài viết này rất hữu ích

    15 Tháng Năm, 2017

  2. Hoàng tử

    Giải thích tuyệt vời về mutex và semaphores. cảm ơn bạn đã dành thời gian viết bài này

    9 Tháng Mười, 2017

  3. Teja Seervi

    lời giải thích tốt đẹp. Cảm ơn bạn

    7 Tháng hai, 2018

  4. Vô danh

    Tôi đặc biệt không thích phép loại suy nướng bánh, được sử dụng trong phần giải thích này

    15 Tháng Bảy, 2018

  5. thế vệ

    Giải thích rất ngắn gọn, cảm ơn bạn

    22 Tháng Ba, 2020

  6. RoberS

    Ví dụ tốt nhất về mã Python mà tôi từng thấy. Tôi thực sự không hiểu cách thức hoạt động của nó trong Python cho đến khi tôi lặp lại mã của bạn. Cảm ơn bạn

    Khóa Python có phải là một mutex không?

    Khóa thông dịch viên toàn cầu Python hay GIL, nói một cách đơn giản, là một mutex [hoặc khóa] chỉ cho phép một luồng giữ quyền kiểm soát trình thông dịch Python.

    Làm cách nào để khóa một tệp trong Python?

    Khóa tệp Python . Đây là gói khóa tệp độc lập với nền tảng. Python cung cấp trình quản lý gói PIP để quản lý các gói phần mềm. Vì vậy, trước tiên chúng ta cần cài đặt PIP trên hệ thống. install a lockfile module. This is a platform-independent file locking package. Python provides the PIP package manager to manage software packages. So, we need to have PIP installed on the system first.

    Khóa luồng Python là gì?

    Tình trạng xảy ra khi một luồng cố gắng sửa đổi tài nguyên được chia sẻ cùng lúc với một luồng khác đang sửa đổi tài nguyên đó – điều này dẫn đến đầu ra bị cắt xén, đó là lý do tại sao các luồng . Mô-đun luồng của Python bao gồm các khóa như một công cụ đồng bộ hóa. Một khóa có hai trạng thái. bị khóa.

    Tại sao sử dụng semaphore thay vì khóa?

    Sự khác biệt trong quyền truy cập . Tất cả các chủ đề khác phải chặn và chờ truy cập. Trong khi đó, một semaphore cho phép một số luồng cố định có được và giữ một vị trí trên semaphore .

Chủ Đề