2015-06-18 17 views
8

Tôi có hai tập lệnh Python, cả hai đều cần khoảng thời gian đều đặn (nghĩ cronjobs) để gọi một chương trình bên ngoài.Có cách nào để ngăn không cho hai chương trình Python thực thi cùng một nhị phân cùng một lúc không?

Nếu chương trình này (mà chúng tôi không kiểm soát) được gọi hai lần đồng thời, lỗi dữ liệu xảy ra, vì vậy chúng tôi cần có cách để đồng bộ hóa cuộc gọi đến nhị phân này.

Có cách nào để thực hiện việc này hay không, tốt nhất là chỉ sử dụng thư viện chuẩn của Python?

+0

Chỉ cần sử dụng khóa dựa trên tệp mà mỗi tập lệnh kiểm tra trước khi thực thi nhị phân bên ngoài. –

+0

Nếu chương trình ở bên ngoài, cả hai tập lệnh đều có thể chia sẻ tệp "khóa" đơn giản. – Alex

+0

Tôi không * nghĩ * có một giải pháp sẵn sàng để sử dụng trong stdlib; nhưng có [lockfile] (https://pypi.python.org/pypi/lockfile) –

Trả lời

5

Vì vậy, mà không sử dụng một thư viện của bên thứ 3 như filelock bạn sẽ phải làm một cái gì đó như thế này:

import os 
from subprocess import check_call 

if os.path.exists("/var/run/foo.ock"): 
    print("Backing off...") 
    raise SystemExit(1) 

try: 
    with open("/var/run/foo.lock", "w"): 
     check_call("/path/to/binary") 
finally: 
    os.remove("/var/run/foo.lock") 

Cách tiếp cận tốt hơn là sử dụng filelock (nếu bạn có thể cài đặt thư viện của bên thứ 3) :

from filelock import FileLock 

with FileLock("/path/to/binary"): 
    check_call("/path/to/binary") 

Bạn có thể dễ dàng cài đặt filelock sử dụng pip:

$ pip install filelock 

Xem thêm liên quan: Locking a file in Python

Lưu ý: Ngoài ra còn có vẻ là một rất giống tên gói gọi lockfile! (Đừng nhầm lẫn cả hai!)

Các vấn đề liên quan