Trong hướng dẫn này, bạn sẽ tìm hiểu về hàm Pythonsleep() cho phép bạn chèn độ trễ trong quá trình thực thi chương trình. Đây là một hàm hữu ích, đặc biệt khi chương trình của bạn làm việc với thread hoặc khi bạn làm việc với đồ họa và hoạt hình. Hàm sleep có sẵn trong mô-đun time, mô-đun này chứa nhiều hàm khác xử lý truy cập và chuyển đổi thời gian. Và mặc dù mô-đun này có sẵn trên mọi nền tảng, không phải tất cả các hàm bên trong đều có sẵn hoặc hoạt động hoàn toàn giống nhau. Hãy cùng tìm hiểu chi tiết hơn về mô-đun time.sleep()...
Mô-đun Time
Mô-đun này cung cấp các hàm giúp thao tác thời gian và sử dụng chúng trong chương trình của bạn. Có những mô-đun “họ hàng” khác làm việc chính xác hơn với ngày và lịch trong hệ thống của bạn, nhưng mô-đun này tập trung nhiều hơn vào việc thao tác thời gian — làm việc với giờ cho đến tận mili giây.
Một số thuật ngữ bạn sẽ thường nghe khi làm việc với thời gian trong lĩnh vực khoa học máy tính là epoch.
Trước hết, hãy đảm bảo bạn đã import mô-đun time. Để làm điều đó, chỉ cần gõ:
Đây là mốc chính xác khi “thời gian” bắt đầu. Điều này không có nghĩa là sự ra đời của hệ Mặt Trời hay khi con người bắt đầu đo thời gian, mà thực ra khá gần với hiện tại. Đối với hệ thống UNIX, epoch là ngày 1 tháng 1 năm 1970, 00:00:00 (UTC) (đó là thứ Năm nếu bạn tò mò...) Để biết epoch trên hệ thống của bạn, bạn có thể gõ:
Kết quả này sẽ cho bạn biết năm (tm_year), tháng (tm_mon), ngày (tm_mday), giờ (tm_hour), phút (tm_min) và giây (tm_sec). Cùng với thứ trong tuần (tm_wday) — giá trị là 3 vì thứ Hai được tính là ngày đầu tuần và được đánh số 0. Tiếp theo là ngày thứ bao nhiêu trong năm (tm_yday), còn gọi là ngày Julius. Và cuối cùng là cờ giờ tiết kiệm ánh sáng ban ngày (tm_isdst) — DST là viết tắt của daylight saving time. Trường này có các giá trị 0, -1 hoặc 1. 0 nếu không áp dụng DST. 1 nếu đang áp dụng DST, và -1 nếu thông tin không có sẵn. Tại sao lại không có sẵn? Bởi vì quy tắc DST do luật địa phương quyết định và có thể thay đổi.
Hầu hết máy tính lưu trữ ngày giờ dưới dạng hiệu số giây giữa ngày 1 tháng 1 năm 1970, 00:00:00 (UTC) và thời điểm cần lưu. Vì vậy, nếu bạn gõ:
Kết quả sẽ cho bạn biết số giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970, 00:00:00 (UTC). Hiệu số này được gọi là timestamp hoặc thời gian epoch của UNIX, và ở dạng số thực dấu phẩy động. Thực ra... nói chính xác thì hiệu số này không tính theo giây mà theo cái gọi là tick. Trên hầu hết hệ thống UNIX, đồng hồ “tick” 50 đến 100 lần mỗi giây. Do đó, thời gian epoch của UNIX thực chất là số tick đã xảy ra kể từ 01/01/1970, 00:00:00 UTC.
Giờ thì bạn đã có hình dung về những gì mô-đun time làm. Hãy xem hàm sleep().
time.sleep()
Nói đơn giản, time.sleep() nhận đối số là số giây bạn muốn chương trình tạm dừng trước khi chuyển sang bước tiếp theo. Hãy xem ví dụ chương trình đơn giản, trong đó chúng ta in ra thời gian hiện tại với khoảng dừng 5 giây giữa mỗi lần thực thi tiếp theo — do đó tạo ra chênh lệch 5 giây giữa mỗi lần in thời gian hiện tại. Dùng time.ctime() giúp hiển thị giờ địa phương ở định dạng gọn gàng.
for count inrange(5):print(time.ctime())# Prints the current time with a five second difference
time.sleep(5)Được hỗ trợ bởi
Sun Jan 2718:46:242019
Sun Jan 2718:46:292019
Sun Jan 2718:46:342019
Sun Jan 2718:46:392019
Sun Jan 2718:46:442019Được hỗ trợ bởi
Cú pháp của hàm là: time.sleep(sec) trong đó sec là đối số chỉ định số giây chương trình sẽ bị tạm dừng. Hàm không trả về giá trị.
sec — Đối số này thực chất là một số thực dấu phẩy động, vì vậy bạn có thể đặt thời gian ngủ chính xác hơn. Tuy nhiên, điều này có chút không chắc chắn vì thời gian tạm dừng thực tế có thể ngắn hơn thời gian yêu cầu hoặc dài hơn một cách tùy ý. Để hiểu rõ hơn, hãy hình dung chương trình như một công việc được xử lý bởi các nhân viên bán hàng khác nhau trong cửa hàng — khi bạn tạm dừng chương trình, người đang làm việc đó lập tức được phân cho khách khác. Nhưng ngay sau đó (sớm hơn số giây sleep đã chỉ định), một nhân viên rảnh khác tiếp nhận công việc và tiếp tục hoàn thành — do đó thời gian tạm dừng có thể ngắn hơn. Tương tự, thời gian tạm dừng có thể dài hơn yêu cầu một cách tùy ý vì việc lập lịch cho tất cả nhân viên trong cửa hàng, khiến chương trình phải chờ đến lượt. Bên trong thì phức tạp hơn nhiều, và đã có nhiều cách xử lý được đưa ra.
for count inrange(3):print(time.ctime())# Prints the current time with a five second difference
time.sleep(2.5)Được hỗ trợ bởi
Sun Jan 2718:46:492019
Sun Jan 2718:46:522019
Sun Jan 2718:46:542019Được hỗ trợ bởi
Python không đưa ra đảm bảo nào về hành vi của các lời gọi hàm này, đặc biệt là giữa các nền tảng. Lý do cơ bản là hầu hết các hàm được định nghĩa trong mô-đun này gọi các hàm thư viện C của nền tảng với cùng tên. Độ chính xác thực sự phụ thuộc vào độ chính xác của hàm sleep trong hệ điều hành nền tảng và nếu bạn cần tìm hiểu sâu hơn — tốt nhất hãy xem tài liệu của nền tảng vì ngữ nghĩa của các hàm này khác nhau giữa các nền tảng.
Tuy nhiên, có một tin vui: bắt đầu từ Python phiên bản 3.5, time.sleep(secs) sẽ ngủ ít nhất secs (đối số truyền vào) ngay cả khi sleep bị gián đoạn bởi một tín hiệu (một lần nữa, hãy hình dung tín hiệu như một nhân viên bán hàng như ví dụ ở trên), trừ khi bộ xử lý tín hiệu phát sinh ngoại lệ.
Vậy bên trong xảy ra gì khi dùng time.sleep()? Phần này nhằm giúp hiểu rõ hơn về hàm nhưng không bắt buộc để bạn có thể sử dụng ngay. Hàm này thực tế sử dụng Đồng hồ Hệ thống, một thiết bị điện tử trong máy tính phát tín hiệu tần số cao ổn định để đồng bộ mọi thành phần bên trong và là một phần của bộ xử lý. Mô-đun này phát ra cái gọi là Yêu cầu Ngắt (IRQ) theo các khoảng thời gian lập trình được. IRQ chịu trách nhiệm ngắt đoạn mã hiện tại mà bộ xử lý đang thực thi, lưu trạng thái hiện tại trước khi chuyển quyền điều khiển cho một đoạn mã khác trong hệ điều hành. Vì vậy, những gì hàm sleep() làm là gọi thủ tục hoàn tất I/O cơ bản hoặc lời gọi thủ tục bất đồng bộ để chặn tiến trình. Hệ điều hành sẽ ghi nhận rằng bạn không muốn làm gì khác cho đến khi hết thời gian chờ. Khi thời gian chờ này kết thúc, hệ điều hành sẽ tiếp tục tiến trình của bạn từ trạng thái cuối cùng mà nó ghi nhớ. Và từ góc nhìn của bạn, chỉ là một lời gọi đơn giản tới hàm time.sleep().
Chúc mừng bạn đã nắm vững hàm time.sleep(). Hãy xem khóa học Python Data Science Toolbox (Phần 1) của DataCamp để tìm hiểu thêm về các hàm trong Python.
Trong hướng dẫn này, bạn sẽ tìm hiểu về hàm Python
sleep()cho phép bạn chèn độ trễ trong quá trình thực thi chương trình. Đây là một hàm hữu ích, đặc biệt khi chương trình của bạn làm việc với thread hoặc khi bạn làm việc với đồ họa và hoạt hình. Hàm sleep có sẵn trong mô-đuntime, mô-đun này chứa nhiều hàm khác xử lý truy cập và chuyển đổi thời gian. Và mặc dù mô-đun này có sẵn trên mọi nền tảng, không phải tất cả các hàm bên trong đều có sẵn hoặc hoạt động hoàn toàn giống nhau. Hãy cùng tìm hiểu chi tiết hơn về mô-đuntime.sleep()...Mô-đun Time
Mô-đun này cung cấp các hàm giúp thao tác thời gian và sử dụng chúng trong chương trình của bạn. Có những mô-đun “họ hàng” khác làm việc chính xác hơn với ngày và lịch trong hệ thống của bạn, nhưng mô-đun này tập trung nhiều hơn vào việc thao tác thời gian — làm việc với giờ cho đến tận mili giây.
Một số thuật ngữ bạn sẽ thường nghe khi làm việc với thời gian trong lĩnh vực khoa học máy tính là epoch.
Trước hết, hãy đảm bảo bạn đã import mô-đun time. Để làm điều đó, chỉ cần gõ:
epoch
Đây là mốc chính xác khi “thời gian” bắt đầu. Điều này không có nghĩa là sự ra đời của hệ Mặt Trời hay khi con người bắt đầu đo thời gian, mà thực ra khá gần với hiện tại. Đối với hệ thống UNIX, epoch là ngày 1 tháng 1 năm 1970, 00:00:00 (UTC) (đó là thứ Năm nếu bạn tò mò...) Để biết epoch trên hệ thống của bạn, bạn có thể gõ:
Kết quả này sẽ cho bạn biết năm (tm_year), tháng (tm_mon), ngày (tm_mday), giờ (tm_hour), phút (tm_min) và giây (tm_sec). Cùng với thứ trong tuần (tm_wday) — giá trị là 3 vì thứ Hai được tính là ngày đầu tuần và được đánh số 0. Tiếp theo là ngày thứ bao nhiêu trong năm (tm_yday), còn gọi là ngày Julius. Và cuối cùng là cờ giờ tiết kiệm ánh sáng ban ngày (tm_isdst) — DST là viết tắt của daylight saving time. Trường này có các giá trị 0, -1 hoặc 1. 0 nếu không áp dụng DST. 1 nếu đang áp dụng DST, và -1 nếu thông tin không có sẵn. Tại sao lại không có sẵn? Bởi vì quy tắc DST do luật địa phương quyết định và có thể thay đổi.
Hầu hết máy tính lưu trữ ngày giờ dưới dạng hiệu số giây giữa ngày 1 tháng 1 năm 1970, 00:00:00 (UTC) và thời điểm cần lưu. Vì vậy, nếu bạn gõ:
Kết quả sẽ cho bạn biết số giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970, 00:00:00 (UTC). Hiệu số này được gọi là timestamp hoặc thời gian epoch của UNIX, và ở dạng số thực dấu phẩy động. Thực ra... nói chính xác thì hiệu số này không tính theo giây mà theo cái gọi là tick. Trên hầu hết hệ thống UNIX, đồng hồ “tick” 50 đến 100 lần mỗi giây. Do đó, thời gian epoch của UNIX thực chất là số tick đã xảy ra kể từ 01/01/1970, 00:00:00 UTC.
Giờ thì bạn đã có hình dung về những gì mô-đun time làm. Hãy xem hàm
sleep().time.sleep()
Nói đơn giản,
time.sleep()nhận đối số là số giây bạn muốn chương trình tạm dừng trước khi chuyển sang bước tiếp theo. Hãy xem ví dụ chương trình đơn giản, trong đó chúng ta in ra thời gian hiện tại với khoảng dừng 5 giây giữa mỗi lần thực thi tiếp theo — do đó tạo ra chênh lệch 5 giây giữa mỗi lần in thời gian hiện tại. Dùngtime.ctime()giúp hiển thị giờ địa phương ở định dạng gọn gàng.Cú pháp của hàm là:
time.sleep(sec)trong đó sec là đối số chỉ định số giây chương trình sẽ bị tạm dừng. Hàm không trả về giá trị.sec — Đối số này thực chất là một số thực dấu phẩy động, vì vậy bạn có thể đặt thời gian ngủ chính xác hơn. Tuy nhiên, điều này có chút không chắc chắn vì thời gian tạm dừng thực tế có thể ngắn hơn thời gian yêu cầu hoặc dài hơn một cách tùy ý. Để hiểu rõ hơn, hãy hình dung chương trình như một công việc được xử lý bởi các nhân viên bán hàng khác nhau trong cửa hàng — khi bạn tạm dừng chương trình, người đang làm việc đó lập tức được phân cho khách khác. Nhưng ngay sau đó (sớm hơn số giây sleep đã chỉ định), một nhân viên rảnh khác tiếp nhận công việc và tiếp tục hoàn thành — do đó thời gian tạm dừng có thể ngắn hơn. Tương tự, thời gian tạm dừng có thể dài hơn yêu cầu một cách tùy ý vì việc lập lịch cho tất cả nhân viên trong cửa hàng, khiến chương trình phải chờ đến lượt. Bên trong thì phức tạp hơn nhiều, và đã có nhiều cách xử lý được đưa ra.
Python không đưa ra đảm bảo nào về hành vi của các lời gọi hàm này, đặc biệt là giữa các nền tảng. Lý do cơ bản là hầu hết các hàm được định nghĩa trong mô-đun này gọi các hàm thư viện C của nền tảng với cùng tên. Độ chính xác thực sự phụ thuộc vào độ chính xác của hàm sleep trong hệ điều hành nền tảng và nếu bạn cần tìm hiểu sâu hơn — tốt nhất hãy xem tài liệu của nền tảng vì ngữ nghĩa của các hàm này khác nhau giữa các nền tảng.
Tuy nhiên, có một tin vui: bắt đầu từ Python phiên bản 3.5,
time.sleep(secs)sẽ ngủ ít nhất secs (đối số truyền vào) ngay cả khi sleep bị gián đoạn bởi một tín hiệu (một lần nữa, hãy hình dung tín hiệu như một nhân viên bán hàng như ví dụ ở trên), trừ khi bộ xử lý tín hiệu phát sinh ngoại lệ.Vậy bên trong xảy ra gì khi dùng
time.sleep()?Phần này nhằm giúp hiểu rõ hơn về hàm nhưng không bắt buộc để bạn có thể sử dụng ngay. Hàm này thực tế sử dụng Đồng hồ Hệ thống, một thiết bị điện tử trong máy tính phát tín hiệu tần số cao ổn định để đồng bộ mọi thành phần bên trong và là một phần của bộ xử lý. Mô-đun này phát ra cái gọi là Yêu cầu Ngắt (IRQ) theo các khoảng thời gian lập trình được. IRQ chịu trách nhiệm ngắt đoạn mã hiện tại mà bộ xử lý đang thực thi, lưu trạng thái hiện tại trước khi chuyển quyền điều khiển cho một đoạn mã khác trong hệ điều hành.
Vì vậy, những gì hàm sleep() làm là gọi thủ tục hoàn tất I/O cơ bản hoặc lời gọi thủ tục bất đồng bộ để chặn tiến trình. Hệ điều hành sẽ ghi nhận rằng bạn không muốn làm gì khác cho đến khi hết thời gian chờ. Khi thời gian chờ này kết thúc, hệ điều hành sẽ tiếp tục tiến trình của bạn từ trạng thái cuối cùng mà nó ghi nhớ. Và từ góc nhìn của bạn, chỉ là một lời gọi đơn giản tới hàm
time.sleep().Chúc mừng bạn đã nắm vững hàm
time.sleep(). Hãy xem khóa học Python Data Science Toolbox (Phần 1) của DataCamp để tìm hiểu thêm về các hàm trong Python.