Làm cách nào để giảm mức sử dụng CPU cho chương trình Python này?


15

Tôi sẽ có một Python chạy 24/7 trong một vòng lặp, đây là một ví dụ về loại chương trình:

while True:

    print ("me again...")

Nhưng khi tôi chạy nó, CPU của tôi đạt 100%! Nhưng tôi không muốn rằng vì chương trình của tôi sẽ chạy trong thời gian dài, v.v. và tôi không muốn CPU của mình trở nên rất nóng, liệu tôi có thể ngăn chặn điều này không?


3
không cần chờ CPU đi 100% vì đó là những gì bạn bảo nó làm :) in nhanh nhất có thể. Vì vậy, chờ đợi sẽ giúp giảm tải gánh nặng đó. in, nói chung là một hoạt động rất tốn kém. viết vào một tập tin là rẻ hơn nhiều.
Piotr Kula

Bạn cần nói với hệ điều hành rằng bạn không muốn bất kỳ chu kỳ cpu nào trong một khoảng thời gian nhất định, nếu không bạn không thể làm gì để tránh những gì bạn thấy.
Thorbjørn Ravn Andersen

Câu trả lời:


16

Ở cuối vòng lặp của bạn có một

time.sleep(xx)trong vài giây hoặc time.sleep(x.x)để biểu thị một phần giây

(Xin nhớ nhập thời gian thư viện, như vậy import time:)

Với xx càng cao càng tốt mà không ảnh hưởng xấu đến chương trình của bạn. Ngay bây giờ chương trình của bạn luôn làm mọi thứ nhanh nhất có thể, thay vì dành thời gian cho Pi nghỉ ngơi hoặc làm việc khác.


Hmmmm ... Rất thú vị ... Tôi sẽ thử. Cảm ơn! Không thể tin được là tôi đã không nghĩ về điều đó!
dùng151324

Có thư viện nào tôi nên nhập, v.v.? Tôi đang gặp lỗi khi nói rằng thời gian không được xác định
user151324

@coding_corgi vâng, bạn cần thư viện thời gian.
Butters

2
Vậy import timesao
dùng151324

@coding_corgi. Vâng, đó là chính xác.
Butters

14

Lời nói đầu

Hãy chắc chắn rằng bạn thực sự cần phải chạy nhiệm vụ của bạn nhiều lần. Điều này được gọi là chờ đợi bận rộn và hầu như luôn luôn tối ưu. Nếu tác vụ của bạn đang kiểm tra đầu ra của một quy trình con, bạn có thể chỉ cần subprocess.wait()hoàn thành nó. Nếu nhiệm vụ của bạn là đợi một tệp hoặc thư mục trong hệ thống tệp được chạm vào, bạn có thể sử dụng pyinotify để mã được kích hoạt từ sự kiện hệ thống tệp được xử lý bởi kernel.

Câu trả lời

Đây là cách bạn viết vòng lặp vô hạn cho việc chờ đợi bận rộn mà không tốn quá nhiều CPU.

Con trăn 2:

from __future__ import print_function
from __future__ import division

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Con trăn 3:

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Đánh giá

Như @gnibbler đã thử nghiệm trong một câu trả lời khác , mã được trình bày không nên tiêu thụ nhiều hơn 1% CPU trên các máy gần đây. Nếu nó vẫn tiêu tốn quá nhiều CPU với mã tải trọng của bạn, hãy xem xét tăng thời gian để ngủ hơn nữa. Mặt khác, mã tải trọng có thể cần được tối ưu hóa để thực hiện lặp lại. Ví dụ, bộ nhớ đệm có thể tăng tốc độ chạy trên dữ liệu không thay đổi.

Tín dụng

Câu trả lời này cố gắng xây dựng dựa trên câu trả lời của @ user2301728 .



1

Bạn cũng có thể thử nice -n 19 python myscript.py .

Nice là một tiện ích * nix để đặt mức độ ưu tiên của CPU cho một tác vụ. 19 là trọng lượng lớn nhất và do đó cài đặt chậm nhất.


2
Không. Nâng cao tính độc đáo của một quy trình chỉ giúp bằng cách cho phép các quy trình khác lấy CPU thường xuyên hơn. Tại bất kỳ thời điểm nào không có quy trình nào khác, mã của OP vẫn sẽ sử dụng CPU 100% và nếu có, họ sẽ sử dụng CPU, tổng cộng lại là 100%.
Bengt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.