Bạn có thể chạy cùng một tập lệnh python hai lần không?
Jeff McNeil 2007-06-18 20. 57. 02 UTC liên kết cố định Tôi có một công việc xử lý nhật ký khá lớn ở đây có cùngyêu cầu. Tôi xử lý và sắp xếp nhật ký Apache từ cụm 8 chiều. Tôi sắp xếp và tính toán số liệu thống kê trong các công việc hàng loạt kéo dài 15 phút. Chỉ một bản sao được chạy cùng một lúc. Tôi mở một tệp và khóa nó bằng cách như thế này. nhập fcntl fhandle = file("ourlockfile. txt", "w") hãy thử. fcntl. lockf(fhandle. fileno(), fcntl. LOCK_EX. fcntl. LOCK_NB) ngoại trừ IOError, e. nếu e. sai == sai. LẠI. in >>sys. stderr, "đang thoát, một bản sao khác hiện đang chạy" else. nâng cao Tôi đã gói nó trong một lớp 'FileBasedLock', giống như các đối tượng Lock trong mô-đun luồng. Nếu hệ thống đánh bom và khởi động lại, ổ khóa sẽ bị xóa. Nếu tiến trình đầu tiên chết do 'kill -XX', các khóa mà tiến trình đó sở hữu sẽ được giải phóng. Tất tất nhiên, những tác động bên ngoài có thể làm hỏng tất cả, nhưng điều đó không quá đáng lo ngại trong môi trường của chúng ta. Mặc dù tôi không biết tính năng này di động đến mức nào, nhưng nó hoạt động rất tốt cho những gì tôi đang làm trên RHES 5. -Jeff Bạn cũng có thể thực hiện việc này bằng cách giữ tệp đang mở ở chế độ ghi cho đến khi f=open('lock. txt','w') The best cross platform way to create a lock is creating a directory. It is atomic on both windows and linux anyway. os.mkdir("lock") print "locked!" do_stuff() os.rmdir("lock") (untested) Là người chỉ biết đến cửa sổ, tôi không biết điều đó. ) Thực ra tôi nghĩ là có, chủ đề này đã xảy ra trước đây - một vài tháng trước. ) Tôi sẽ lo lắng với tùy chọn tồn tại thư mục vì cùng lý do hiện tại tôi không sử dụng phương thức tồn tại tệp. Có thể thư mục tồn tại khi tập lệnh không chạy, do đó ngăn tập lệnh chạy lại cho đến khi ai đó thông báo. Trên Windows, phương pháp mở tệp để ghi hoạt động tốt, nhưng vì *nix không hoạt động theo cách tương tự nên có thể giải pháp ổ cắm . Ổ cắm không thể tồn tại khi tập lệnh không cross-platform option. The socket can't exist when the script isn't chạy và nếu bạn thử tạo một ổ cắm trùng lặp, bạn sẽ bắt gặp ngoại lệ và thoát. Tất nhiên là IMHO. . ) -- http. //email. con trăn. org/mailman/listinfo/python-list Jeff McNeil 2007-06-18 20. 58. 31 UTC liên kết cố định Lưu ý rằng trong thực tế, tập lệnh sẽ thoát hoàn toàn nếu một bản sao khác đang chạy.Tôi có một công việc xử lý nhật ký khá lớn ở đây có yêu cầu tương tự Bạn cũng có thể thực hiện việc này bằng cách giữ tệp đang mở ở chế độ ghi cho đến khi f=open('lock. txt','w') The best cross platform way to create a lock is creating a directory. It is atomic on both windows and linux anyway. os.mkdir("lock") print "locked!" do_stuff() os.rmdir("lock") (untested) Là người chỉ biết đến cửa sổ, tôi không biết điều đó. ) Thực ra tôi nghĩ là có, chủ đề này đã xảy ra trước đây - một vài tháng trước. ) Tôi sẽ lo lắng với tùy chọn tồn tại thư mục vì cùng lý do hiện tại tôi không sử dụng phương thức tồn tại tệp. Có thể thư mục tồn tại khi tập lệnh không chạy, do đó ngăn tập lệnh chạy lại cho đến khi ai đó thông báo. Trên Windows, phương pháp mở tệp để ghi hoạt động tốt, nhưng vì *nix không hoạt động theo cách tương tự nên có thể giải pháp ổ cắm . Ổ cắm không thể tồn tại khi tập lệnh không cross-platform option. The socket can't exist when the script isn't chạy và nếu bạn thử tạo một ổ cắm trùng lặp, bạn sẽ bắt gặp ngoại lệ và thoát. Tất nhiên là IMHO. . ) -- http. //email. con trăn. org/mailman/listinfo/python-list Tim Williams 2007-06-18 17. 17. 40 UTC liên kết cố định Tôi muốn ngăn tập lệnh python chạy hai lần; . cổng được xác định trước (có lẽ là trên 1024), sau đó cài đặt chương trình của bạn . ). determine whether or not to run (or whether to do some of the remaining work, etc.). Bạn không cần nói chuyện với ổ cắm, tập lệnh thứ hai đang cố tạo ổ cắm thứ hai trên cùng một số sẽ đưa ra một ngoại lệ và bạn có thể exit the script cleanly without running a second copy. Bạn cũng có thể thực hiện việc này bằng cách giữ tệp đang mở ở chế độ ghi cho đến khi tập lệnh kết thúc. hãy thử. mở('khóa. txt','w') my_script() ngoại trừ. #print tập lệnh đang chạy Nếu tệp đã được mở thì tập lệnh sẽ không chạy, nếu tập lệnh kết thúc . Trong cả hai trường hợp, nếu tập lệnh kết thúc bình thường hoặc gặp sự cố hoặc máy khởi động lại. Khóa (tức là ổ cắm hoặc tệp đang mở) được giải phóng. HTH. ) -- Evan Klitzke 2007-06-18 17. 44. 48 UTC liên kết cố định Bài đăng của Tim Williams Tôi muốn ngăn tập lệnh python chạy hai lần; . cổng được xác định trước (có lẽ là trên 1024), sau đó cài đặt chương trình của bạn . ). determine whether or not to run (or whether to do some of the remaining work, etc.). You don't need to talk to the socket, a second script trying to create a second socket on the same number will throw an exception and you can exit the script cleanly without running a second copy. Chỉ cần cố gắng liên kết với cổng là điều đơn giản nhất cần làm nếu tất cả những gì bạn muốn làm là kiểm tra xem phiên bản khác của tập lệnh có đang chạy hay không because as Tim pointed out, you cannot bind to a port that another program is using. But there's also an advantage to spending the time để thực sự thiết lập một số loại giao thức liên lạc bằng cách sử dụng cổng vì hai lý do. 1) nếu một chương trình khác liên kết với cổng, bạn sẽ có thể phát hiện ra điều này và 2) có thể thuận lợi khi chia công việc giữa hai . Ví dụ: the processes by having them communicate over the socket. For example, có thể xảy ra trường hợp quy trình đầu tiên có thể báo cho phiên bản thứ hai của tập lệnh "Tôi sắp hoàn thành, nếu bạn muốn trợ giúp . " this part of the remaining problem." -- Tim Williams 2007-06-18 19. 07. 06 UTC liên kết cố định ......... Bài đăng của Wildemar Wildenburger details. Normally your create a file and then remove it whilst keeping the file handle; that allows your program to write to it whilst guaranteeing that it will vanish when you die, but this has to be a named file so that the second instance can check for it. Điều đó có ngăn nó bị xóa không? . experience is long, but fairly primitive. prior existance :) If one process has the file open for writing, no other process can open it for writing at the same time - and this is what you are checking for! The exception that the second concurrent open/write attempt raises tells you that another instance of the script is running. This has the added advantage that should something go wrong, such as an abnormal termination or reboot, the open/write disappears and the next time the script runs everything is back to normal. HTH :) |