Tôi đang viết một tập lệnh Python 2.7
.
Tóm lại, tập lệnh này được chạy mỗi tối trên Linux
và kích hoạt một số quy trình.python - đảm bảo tập lệnh chỉ được kích hoạt khi
Tôi muốn đảm bảo tập lệnh này không chạy song song nhiều lần (về cơ bản cố bắt chước mô hình Singleton
nhưng ở cấp ứng dụng).
Mã số Ví dụ
def main():
# before doing anything, I'd like to know whether this
# script was activated and alive.
# if so, error out
# do something
if __name__ == "__main__":
main()
Đề xuất
Giải pháp ngây thơ sẽ là để tạo ra một số loại của một tập tin khóa, hoạt động như một mutex.
Điều đầu tiên chúng ta làm là kiểm tra xem tệp này có tồn tại không. nếu vậy, sau đó trường hợp khác của kịch bản đã tạo ra nó và chúng ta nên lỗi. khi tập lệnh được thực hiện, chúng tôi sẽ xóa tệp này.
Tôi giả định giải pháp này sẽ hoạt động, miễn là các thao tác trên hệ thống tệp là nguyên tử.
Thực hiện
import os, sys
lock_file_path = ".lock_script"
def lock_mutex():
if os.path.exists(lock_mutex_path):
print "Error: script was already activated."
sys.exit(-1)
else:
file = open(lock_mutex_path, 'w')
def unlock_mutex():
assert(os.path.exists(lock_mutex_path))
os.remove(lock_mutex_path)
def main():
try:
lock_mutex()
# do something
unlock_mutex()
except:
unlock_mutex()
if __name__ == "__main__":
main()
Vấn đề
Làm thế nào để đảm bảo lock_mutex()
và unlock_mutex()
là nguyên tử?
Bạn không muốn gọi tập lệnh nếu nó hoạt động đúng không? – Artur
Trong sự tò mò, kịch bản bắt đầu như thế nào mà đây là một mối quan tâm? – ratatoskr
Tôi không nghĩ giải pháp của bạn là giải pháp * ngây thơ *. Trong thực tế, nó là khá phổ biến cho một để tạo ra một tập tin khóa để kiểm tra xem kịch bản đang chạy. – aIKid