ฉันจะลดการใช้งาน CPU สำหรับโปรแกรม Python นี้ได้อย่างไร


15

ฉันจะให้ Python ทำงาน 24/7 ในขณะนี้นี่คือตัวอย่างของโปรแกรม:

while True:

    print ("me again...")

แต่เมื่อฉันรันมัน CPU ของฉันจะไป 100%! แต่ฉันไม่ต้องการเพราะโปรแกรมของฉันจะทำงานเป็นเวลานาน ฯลฯ และฉันไม่ต้องการให้ซีพียูของฉันร้อนมากมีอยู่แล้วฉันสามารถป้องกันได้หรือไม่


3
โดยไม่ต้องรอ CPU ไป 100% เพราะนั่นคือสิ่งที่คุณบอกให้ทำ :) พิมพ์ให้เร็วที่สุดเท่าที่จะทำได้ ดังนั้นการรอจะช่วยลดภาระนั้น พิมพ์โดยทั่วไปคือการดำเนินการที่มีราคาแพงมาก การเขียนไฟล์มีราคาถูกกว่ามาก
Piotr Kula

คุณต้องบอกระบบปฏิบัติการว่าคุณไม่ต้องการ cpu cycles ใด ๆ ในช่วงเวลาที่กำหนดมิฉะนั้นคุณจะไม่สามารถทำสิ่งใดเพื่อหลีกเลี่ยงสิ่งที่คุณเห็น
Thorbjørn Ravn Andersen

คำตอบ:


16

ในตอนท้ายของวงของคุณมี

time.sleep(xx)สำหรับวินาทีหรือtime.sleep(x.x)เพื่อแทนวินาทีบางส่วน

(โปรดอย่าลืมที่จะนำเข้าในเวลาห้องสมุดเช่นดังนั้น: import time)

เมื่อ xx สูงที่สุดเท่าที่จะเป็นไปได้โดยไม่ส่งผลกระทบต่อโปรแกรมของคุณ ตอนนี้โปรแกรมของคุณกำลังทำทุกอย่างให้เร็วที่สุดแทนที่จะให้เวลากับ Pi เพื่อพักผ่อนหรือทำอย่างอื่น


อืม ... น่าสนใจมาก ... ข้าจะลองดู ขอบคุณ! ไม่สามารถเชื่อฉันไม่ได้คิดอย่างนั้น!
user151324

มีห้องสมุดที่ฉันควรนำเข้าหรือไม่? ฉันได้รับข้อผิดพลาดซึ่งบอกว่าเวลาไม่ได้ถูกกำหนดไว้
user151324

@coding_corgi ใช่คุณต้องใช้ไลบรารีเวลา
Butters

2
งั้นimport timeเหรอ?
user151324

@coding_corgi ใช่ถูกต้องแล้ว
Butters

14

คำนำ

ต้องแน่ใจว่าคุณจำเป็นต้องทำงานซ้ำ ๆ สิ่งนี้เรียกว่าการรอไม่ว่างและเกือบจะไม่ดีเสมอไป หากงานของคุณกำลังตรวจสอบผลลัพธ์ของกระบวนการย่อยคุณสามารถsubprocess.wait()ทำมันให้เสร็จตัวอย่างเช่น หากงานของคุณคือรอไฟล์หรือไดเรกทอรีในระบบไฟล์ที่จะสัมผัสคุณสามารถใช้pyinotifyเพื่อรับรหัสของคุณที่ถูกทริกเกอร์จากเหตุการณ์ระบบไฟล์ที่จัดการโดยเคอร์เนล

ตอบ

นี่คือวิธีที่คุณเขียนลูปไม่สิ้นสุดสำหรับการรอไม่ว่างโดยไม่ต้องใช้ 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

การประเมินผล

ตามที่ @gnibbler ทดสอบแล้วในคำตอบอื่นรหัสที่แสดงไม่ควรใช้ CPU มากกว่า 1% ในเครื่องล่าสุด หากยังคงใช้ CPU มากเกินไปกับรหัส payload ของคุณให้พิจารณาเพิ่มเวลาในการนอนหลับให้ดียิ่งขึ้น ในทางกลับกันโค้ด payload อาจต้องได้รับการปรับให้เหมาะสมสำหรับการดำเนินการซ้ำ ๆ ตัวอย่างเช่นการแคชสามารถเพิ่มความเร็วในการทำงานกับข้อมูลที่ไม่เปลี่ยนแปลง

เครดิต

คำตอบนี้พยายามที่จะสร้างเมื่อ@ user2301728 ของคำตอบ


3

ฉันมีปัญหาเดียวกันดูคำถามของฉันในการแลกเปลี่ยนชุด วิธีแก้คือการรวมกันของและtime.sleep(0.01) ลด CPU ที่มีให้กับแอปพลิเคชัน นี่คือวิธีที่ผมเริ่ม app:nicenicenice -n 19


1

nice -n 19 python myscript.pyนอกจากนี้คุณยังสามารถลอง

niceเป็นยูทิลิตี้ * nix เพื่อตั้งค่าลำดับความสำคัญของ CPU ของงาน 19 เป็นน้ำหนักที่ใหญ่ที่สุดและการตั้งค่าที่ช้าที่สุด


2
ไม่การเพิ่มความสวยงามของกระบวนการจะช่วยได้ด้วยการเปิดใช้งานกระบวนการอื่นเพื่อให้ได้ CPU บ่อยขึ้น เมื่อใดก็ตามที่ไม่มีกระบวนการอื่น ๆ รหัสของ OP จะยังคงใช้ CPU 100% และหากมีก็จะใช้ CPU รวมอีกครั้งที่ 100%
Bengt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.