atexit --- Thoát trình xử lý¶
Mô-đun atexit xác định các chức năng để đăng ký và hủy đăng ký các chức năng dọn dẹp. Do đó, các chức năng đã đăng ký sẽ được thực thi tự động khi kết thúc trình thông dịch thông thường. atexit chạy các chức năng này theo thứ tự reverse mà chúng đã được đăng ký; nếu bạn đăng ký A, B và C, tại thời điểm kết thúc phiên dịch, chúng sẽ được chạy theo thứ tự C, B, A.
Note: Các chức năng được đăng ký qua mô-đun này không được gọi khi chương trình bị tắt do tín hiệu không được Python xử lý, khi phát hiện thấy lỗi nội bộ nghiêm trọng của Python hoặc khi os._exit() được gọi.
Note: Hiệu ứng của việc đăng ký hoặc hủy đăng ký các hàm từ bên trong hàm dọn dẹp là không xác định.
Thay đổi trong phiên bản 3.7: Khi được sử dụng với trình thông dịch phụ C-API, các chức năng đã đăng ký sẽ là cục bộ của trình thông dịch mà chúng đã được đăng ký.
- atexit.register(func, *args, **kwargs)¶
Đăng ký func như một hàm sẽ được thực thi khi kết thúc. Bất kỳ đối số tùy chọn nào được chuyển tới func đều phải được chuyển dưới dạng đối số cho
register(). Có thể đăng ký cùng một hàm và các đối số nhiều lần.Khi kết thúc chương trình thông thường (ví dụ: nếu
sys.exit()được gọi hoặc quá trình thực thi của mô-đun chính hoàn tất), tất cả các chức năng đã đăng ký sẽ được gọi theo thứ tự vào sau, ra trước. Giả định là các mô-đun cấp thấp hơn thường sẽ được nhập trước các mô-đun cấp cao hơn và do đó phải được dọn dẹp sau.Nếu một ngoại lệ được đưa ra trong quá trình thực thi các trình xử lý thoát, một truy nguyên sẽ được in (trừ khi
SystemExitđược nâng lên) và thông tin ngoại lệ sẽ được lưu. Sau khi tất cả các trình xử lý thoát đã có cơ hội chạy, ngoại lệ cuối cùng được đưa ra sẽ được đưa ra lại.Hàm này trả về func, giúp bạn có thể sử dụng nó làm công cụ trang trí.
Cảnh báo
Việc bắt đầu các luồng mới hoặc gọi
os.fork()từ một hàm đã đăng ký có thể dẫn đến tình trạng chạy đua giữa các trạng thái luồng giải phóng luồng thời gian chạy Python chính trong khi các quy trìnhthreadingnội bộ hoặc quy trình mới cố gắng sử dụng trạng thái đó. Điều này có thể dẫn đến sự cố thay vì tắt máy hoàn toàn.Thay đổi trong phiên bản 3.12: Nỗ lực bắt đầu một chủ đề mới hoặc
os.fork()một quy trình mới trong chức năng đã đăng ký hiện dẫn đếnRuntimeError.
- atexit.unregister(func)¶
Xóa func khỏi danh sách các hàm sẽ chạy khi tắt phiên dịch.
unregister()âm thầm không làm gì nếu func chưa được đăng ký trước đó. Nếu func đã được đăng ký nhiều lần, mọi lần xuất hiện của chức năng đó trong ngăn xếp lệnh gọiatexitsẽ bị xóa. So sánh đẳng thức (==) được sử dụng nội bộ trong quá trình hủy đăng ký, do đó, các tham chiếu hàm không cần phải có danh tính phù hợp.
atexit Ví dụ¶
Ví dụ đơn giản sau đây minh họa cách mô-đun có thể khởi tạo bộ đếm từ một tệp khi nó được nhập và tự động lưu giá trị cập nhật của bộ đếm khi chương trình kết thúc mà không cần dựa vào ứng dụng thực hiện lệnh gọi rõ ràng vào mô-đun này khi kết thúc.
thử:
với open('counterfile') dưới dạng infile:
_count = int(infile.read())
ngoại trừ FileNotFoundError:
_đếm = 0
bộ đếm def (n):
_count toàn cầu
_count = _count + n
bộ lưu trữ def ():
với open('counterfile', 'w') là outfile:
outfile.write('%d' % _count)
nhập khẩu atexit
atexit.register(bộ đếm lưu trữ)
Đối số vị trí và từ khóa cũng có thể được chuyển tới register() để được chuyển đến hàm đã đăng ký khi nó được gọi:
tạm biệt (tên, tính từ):
print('Tạm biệt %s, hẹn gặp bạn %s.' % (tên, tính từ))
nhập khẩu atexit
atexit.register(tạm biệt, 'Donny', 'tốt đẹp')
# or:
atexit.register(tạm biệt, tính từ='tốt đẹp', name='Donny')
Cách sử dụng như một decorator:
nhập khẩu atexit
@atexit.register
chắc chắn tạm biệt():
print('Bạn hiện đang rời khỏi khu vực Python.')
Điều này chỉ hoạt động với các hàm có thể được gọi mà không cần đối số.