2013-06-12 34 views
7

Tôi đã đùa giỡn với ý tưởng sử dụng time.sleep(n) trong một tập lệnh python để làm cho nó thực hiện công việc ở các khoảng thời gian khác nhau. Mã giả sẽ trông giống như:Python - là cpu time.sleep (n) cpu?

total_jobs = [...] 

next_jobs_to_run = next_closest(total_jobs) 
min_time_to_wait = closestTime(nextJobsToRun) 

wait until min_time_to_wait 
run them all 
get next jobs 

Để tóm tắt, chương trình sẽ ngủ cho đến khi công việc tiếp theo cần được thực hiện. Nó chạy công việc, tìm công việc tiếp theo của nó để chạy, và ngủ cho đến khi nó cần để chạy công việc tiếp theo (tiếp tục vô cùng). Tôi đang lên kế hoạch chạy trên máy Linux - sử dụng cron job là một khả năng. Bất cứ ai cũng có ý kiến ​​về một trong hai?

+1

Tiêu đề và câu hỏi không liên quan? – Serdalis

+0

@Serdalis: Chúng không phải là cùng một câu hỏi, nhưng chúng chắc chắn có liên quan. Nếu 'giấc ngủ 'không bận rộn chờ đợi, điều đó khá nhiều giải quyết câu hỏi mà một trong những sử dụng (ủng hộ" không 'ngủ'"); nếu không, nó sẽ mở câu hỏi. (Tất nhiên, khi nó quay ra, nó không.) – abarnert

Trả lời

21

Không, nó không phải là CPU chuyên sâu.

The documentation nói:

Đình chỉ thực hiện đối với số lượng nhất định của giây.

Python thực sự không thể đảm bảo rằng trong mọi triển khai có thể, điều này có nghĩa là HĐH sẽ không bao giờ lên lịch trình của bạn trong khi ngủ. Nhưng trên mỗi nền tảng, Python cố gắng làm một cái gì đó thích hợp để chặn cho thời gian quy định mà không cần sử dụng bất kỳ CPU nào. Trên một số nền tảng, điều đó vẫn có thể có nghĩa là một chút CPU, nhưng nó sẽ càng ít càng hợp lý.

Đặc biệt, kể từ khi bạn được hỏi về Linux, và có lẽ CPython:

Trên Linux, và hầu hết các nền tảng POSIX khác, nó sẽ thường sử dụng select. Xem the 3.3 source.

man page làm cho nó khá rõ ràng rằng select tạm dừng cho đến khi tín hiệu, thời gian chờ hoặc I/O sẵn sàng (và trong trường hợp này, không có fds, vì vậy sau là không thể).

Bạn có thể đọc mã nguồn hạt nhân để biết chi tiết đầy đủ, nhưng về cơ bản, trừ khi có bất kỳ tín hiệu không mong muốn nào, bạn sẽ không được lên lịch, ngoại trừ một số lượng nhỏ quay ở đầu của select (như một tối ưu hóa cho các trường hợp mà select có thể trở lại gần như ngay lập tức).


Ở giữa tóm tắt của bạn, những thay đổi câu hỏi từ "là sleep CPU-chuyên sâu" thành "tôi nên sử dụng sleep, hoặc một công việc định kỳ?"

Dù bằng cách nào, bạn không phải đốt bất kỳ CPU nào trong khi chờ đợi xung quanh. Có một số ưu và khuyết điểm, nhưng hầu hết trong số đó là tầm thường. Từ (gần đúng và chủ quan) quan trọng nhất đối với ít nhất, một công việc cron:

  • cho phép cấu hình — ví dụ: thay đổi lịch biểu — mà không cần chỉnh sửa mã nguồn.
  • yêu cầu cấu hình hoạt động.
  • có nghĩa là ít mã hơn — có nghĩa là ít lỗi hơn và ít hơn cho bất kỳ người đọc nào trong tương lai hiểu được.
  • sẽ tiếp tục tồn tại khi tắt hệ thống.
  • sẽ kích hoạt lại ngay cả khi tập lệnh của bạn thoát với ngoại lệ hoặc tín hiệu.
  • có thể kích hoạt 0, 1 hoặc N lần nếu khoảng thời gian được lên lịch bị bỏ qua N lần (không được chỉ định và triển khai cron khác nhau thực hiện những việc khác nhau), thay vì được bảo đảm 0.
  • có cơ hội xử lý tốt hơn thay đổi đồng hồ hệ thống.
  • phải thanh toán cho quá trình khởi chạy, khởi động thông dịch viên, v.v ... mỗi khi phát sinh.
  • không lãng phí bảng trang và không gian bảng xử lý vì không có quá trình chạy và không có bộ nhớ được ánh xạ.
3

Không, nó không phải là bộ xử lý chuyên sâu. Nó cho phép bộ vi xử lý nhàn rỗi.

Theo the documentation, nó tạm ngừng thực thi, do đó điều đó có nghĩa là nó không phải là bộ xử lý chuyên sâu. Một busy wait sẽ là bộ xử lý chuyên sâu.