Bagaimana saya bisa menurunkan penggunaan CPU untuk program Python ini?


15

Saya akan menjalankan Python selama 24/7 dalam satu loop sementara, berikut ini adalah contoh dari jenis program:

while True:

    print ("me again...")

Tetapi ketika saya menjalankannya, CPU saya mencapai 100%! Tapi saya tidak mau itu karena program saya akan berjalan untuk waktu yang lama, dll. Dan saya tidak ingin CPU saya menjadi sangat panas, adakah yang bisa mencegahnya?


3
tanpa menunggu CPU berjalan 100% karena itulah yang Anda perintahkan :) cetak secepat mungkin. Jadi, menunggu akan membantu melepaskan beban itu. cetak, umumnya merupakan operasi yang sangat mahal. menulis ke file jauh lebih murah.
Piotr Kula

Anda perlu memberi tahu sistem operasi bahwa Anda tidak ingin siklus CPU apa pun untuk jangka waktu tertentu, jika tidak, Anda tidak dapat melakukan apa pun untuk menghindari apa yang Anda lihat.
Thorbjørn Ravn Andersen

Jawaban:


16

Di akhir lingkaran Anda, miliki a

time.sleep(xx)selama detik, atau time.sleep(x.x)untuk mewakili sebagian detik

(Harap ingat untuk mengimpor waktu perpustakaan, seperti: import time)

Dengan xx setinggi mungkin tanpa mempengaruhi program Anda. Saat ini program Anda selalu melakukan segalanya secepat mungkin, daripada memberikan waktu bagi Pi untuk beristirahat atau melakukan sesuatu yang lain.


Hmmmm ... Sangat menarik ... Saya akan mencobanya. Terima kasih! Tidak bisa percaya saya tidak memikirkan itu!
user151324

Apakah ada perpustakaan yang harus saya impor, dll? Saya mendapatkan pesan kesalahan yang mengatakan bahwa waktu tidak ditentukan
user151324

@coding_corgi ya, Anda perlu perpustakaan waktu.
Butters

2
Jadi import time?
user151324

@coding_corgi. Ya itu benar.
Butters

14

Kata pengantar

Pastikan Anda benar-benar perlu menjalankan tugas Anda berulang kali. Ini disebut sibuk menunggu dan hampir selalu suboptimal. Jika tugas Anda memeriksa output suatu proses, Anda bisa subprocess.wait()menyelesaikannya, misalnya. Jika tugas Anda adalah menunggu file atau direktori di sistem file untuk disentuh, Anda dapat menggunakan pyinotify untuk memicu kode Anda dari peristiwa filesystem yang ditangani oleh kernel.

Menjawab

Ini adalah bagaimana Anda menulis infinite loop untuk menunggu yang sibuk tanpa mengkonsumsi terlalu banyak CPU.

Python 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

Python 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

Evaluasi

Ketika @gnibbler menguji jawaban lain , kode yang disajikan tidak boleh mengkonsumsi lebih dari 1% CPU pada mesin terbaru. Jika masih mengkonsumsi terlalu banyak CPU dengan kode payload Anda, pertimbangkan menambah waktu untuk tidur lebih jauh. Di sisi lain, kode payload mungkin perlu dioptimalkan untuk eksekusi berulang. Misalnya, Caching dapat mempercepat berjalan pada data yang tidak berubah.

Kredit

Jawaban ini mencoba dibangun berdasarkan jawaban @ user2301728 .


3

Saya memiliki masalah yang sama, lihat pertanyaan saya di Stack Exchange . Solusinya adalah kombinasi dari time.sleep(0.01)dan nice. nicemenurunkan CPU yang tersedia untuk suatu aplikasi. Ini adalah bagaimana saya memulai aplikasi: nice -n 19.


1

Anda juga bisa mencoba nice -n 19 python myscript.py.

nice adalah utilitas * nix untuk mengatur prioritas CPU dari suatu tugas. 19 adalah bobot terbesar dan akibatnya merupakan pengaturan paling lambat.


2
Tidak. Meningkatkan kebaikan proses hanya membantu dengan mengaktifkan proses lain untuk mendapatkan CPU lebih sering. Setiap saat tidak ada proses lain, kode OP masih akan menggunakan CPU 100% dan jika ada, mereka akan menggunakan CPU, dengan jumlah total 100%.
Bengt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.