2013-07-06 40 views
7

Tôi đang chơi với chức năng time.sleep từ thư viện chuẩn của python và thấy nó không đủ cho sự chậm trễ của các ms. Từ thử nghiệm tôi tìm thấy nó để thực sự chờ đợi 1,1-1,2 ms cho một chờ đợi 1ms. Thực hiện một chờ đợi bận rộn có độ chính xác trong vòng 1%. Tôi đã sử dụng:Thời gian chờ của Python so với độ chính xác chờ đợi bận rộn

def busy_wait(dt): 
    current_time = time.time() 
    while (time.time() < current_time+dt): 
     pass 

và có thể giảm xuống 0,0001 giây trước khi phá vỡ độ chính xác 1%.

Các câu hỏi chính tôi có là:

  • Tại sao là chức năng ngủ nên không chính xác (có thể là một vấn đề C)? Sẽ nhận được một CPU tốt hơn với tốc độ đồng hồ cao hơn thay đổi điều này?
  • Tại sao mọi người lại sử dụng chế độ ngủ? Lợi thế duy nhất tôi thấy, bảo tồn năng lượng, được giới hạn trong các hệ thống nhúng, phải không?
  • Nó có khả thi để bù đắp cho sự thiếu chính xác của giấc ngủ với hiệu chuẩn không? Cũng giống như vậy:
 
def sleep(dt): 
    sleep(calibration_function(dt)) 

Là một sang một bên, tôi đọc mà ngủ thậm chí không hoạt động tốt với thời gian chờ đợi lâu dài: Upper limit in Python time.sleep()? Tôi cũng đọc ở đâu đó trên SO thực hiện một vòng lặp của các khoảng thời gian ngắn hơn để tăng độ chính xác , nhưng đó là vô ích khi tôi muốn trì hoãn 0,01 giây. Karl Voigtland đề cập đến việc sử dụng nanosleep của ctypes, nhưng tôi cảm thấy điều này là quá mức cần thiết và time.sleep đó nên thực hiện hành vi dự định của nó.

time.sleep là một tính năng python bị hỏng? Hay không ai quan tâm đến việc đo thời gian chính xác đủ?

+1

bản sao có thể có của [Làm thế nào chính xác là python's time.sleep()?] (Http://stackoverflow.com/questions/1133857/how-accurate-is-pythons-time-sleep) – g19fanatic

+0

Yea Tôi figured it was an Hệ điều hành gọi, nhưng bây giờ tôi tự hỏi tại sao họ sử dụng một cuộc gọi hệ điều hành khi một chờ đợi bận rộn là tốt hơn. – JDong

+0

một sự chờ đợi bận rộn làm giảm thời gian CPU và chặn một cpu. Một giấc ngủ sẽ chuyển đổi ngữ cảnh và không chặn thực hiện khác (nó thực hiện 'chặn' thực thi của bạn). Nói chung bạn chỉ bận chờ đợi nếu bạn thực sự cần thời gian chính xác, và thậm chí sau đó bạn vẫn còn giới hạn đối với các hệ điều hành cần cho CPU mà có thể bối cảnh bạn đi xa ... – g19fanatic

Trả lời

4

Trên Windows, chức năng Ngủ của hệ điều hành (mà Python nhất thiết phải sử dụng) chỉ có thể đánh thức một chuỗi trên một bội số của khoảng thời gian hẹn giờ hiện tại. Thông thường, phạm vi này trong khoảng từ 1,0 ms đến 15,6 ms.Giảm khoảng thời giờ có thể có ích vì nó cho phép ngủ ngắn hơn, nhưng nó lãng phí điện, như tôi đã viết trong bài viết này:

http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

Bận chờ đợi có thể cung cấp cho độ chính xác tốt hơn nhưng nói chung là một ý tưởng khủng khiếp vì nó chất thải thậm chí nhiều hơn điện và đánh cắp thời gian CPU từ nhiệm vụ xứng đáng hơn:

https://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/

Cuối cùng, tính chính xác của bận rộn chờ đợi sẽ phụ thuộc vào những gì chức năng hẹn giờ bạn đang sử dụng để có được thời gian hiện tại, và cũng có thể phụ thuộc vào khoảng thời gian hẹn giờ:

https://randomascii.wordpress.com/2013/05/09/timegettime-versus-gettickcount/

Tại sao bạn muốn ngủ trong một khoảng thời gian ngắn như vậy? Thường thì sẽ tốt hơn nếu chờ đợi điều gì đó xảy ra - chờ đợi một sự kiện - thay vì chờ đợi những khoảng thời gian ngắn như vậy.

+0

Trong thực tế Python 'time.sleep()' sử dụng một cuộc gọi 'WaitForSingleObject()' với một thời gian chờ để nắm bắt bất kỳ Ctrl-C trong khi chờ đợi (thông qua 'SetConsoleCtrlHandler()' báo hiệu một sự kiện.) – schlenk

+0

Ứng dụng này là một loại macro; Tôi có một tập hợp các hành động mà tôi muốn mô phỏng rất chính xác. Tôi đã học được cách làm điều này trong C, nhưng vẫn chưa tìm được giải pháp kinh điển trong Python. Câu hỏi của tôi hơi khó trả lời, vì vậy tôi sẽ chấp nhận câu trả lời của bạn ngay bây giờ. Cảm ơn vì sự thấu hiểu. – JDong

+0

@schlenk Cảm ơn thông tin về việc triển khai time.sleep(). Các quy tắc về thời gian chờ có thể hết hạn về cơ bản giống như đối với Sleep() (vì bộ lập lịch chỉ chạy khi có điều gì đó xảy ra hoặc khi bộ hẹn giờ bị gián đoạn) nên câu trả lời vẫn được áp dụng. –

0

Đây là một câu hỏi trùng lặp, nhưng tôi sẽ cố gắng trả lời câu hỏi này ở đây theo khả năng tốt nhất của tôi.

Chức năng ngủ là một cuộc gọi hệ điều hành khác với chờ đợi bận rộn ở chỗ nó không chặn luồng. Nếu bạn có một kịch bản đa luồng mặc dù, nó không nên chặn các chủ đề khác. Chức năng ngủ không chính xác trong Windows vì nó không phải là một hệ điều hành thời gian thực (không chắc chắn điều đó có nghĩa là gì). Nếu bạn đang tìm kiếm nghiêm chỉnh về độ chính xác của sự chờ đợi, chờ đợi bận rộn là con đường để đi. Nếu không, time.sleep() có thể được ưu tiên. Lý do hệ điều hành gọi ngủ là không chính xác có lẽ vì nó dựa trên hệ điều hành để trở về đúng thời điểm và phụ thuộc vào độ chính xác của bộ lập lịch của hệ điều hành.

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