Çözüldü Yazılan program çok fazla CPU tüketiyor

  • Konuyu başlatan Fuqy
  • Başlangıç Tarihi
  • Mesaj 19
  • Görüntüleme 1.209
Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Fuqy

Decapat
Katılım
12 Şubat 2023
Mesajlar
11
Daha fazla  
Cinsiyet
Erkek
Python:
def key_listener():
    while True:
        if keyboard.is_pressed('f4'):
            yazi()
listener = threading.Thread(target=key_listener)
listener.start()
Yazdığım programda bu kısım çok fazla CPU tüketilmesine neden oluyor, bu kısıma alternatif olarak ne yapabilirim? Yapmak istediğim şey ise "F4" tuşuna basılınca kodların tetiklenmesi.
 
Son düzenleyen: Moderatör:
Çözüm
Ne yapması gerektiğini çok güzel anlatmışsınız. Magic numberlar da çok yardımcı oluyor.

Halkımızın arayüz fetişine hayranım. 2 satırı bir araya getiremez ama buton görüp tıklayacak. tkinter kullanmadığım ve kullanmayacağım için çalıştırıp sonucu görüp size bir şey diyemeyeceğim.
Koddaki tonla yanlış kullanıma değinmeyeceğim. Ama yazi isimli bir değişken ve fonksiyon olması aptallığına değinmeden edemeyeceğim. Soyadı diye bir şey niye var hiç düşündünüz mü?

"while True:" kısmını değiştirsek olur gibi sanki.
Yok canım, olur mu öyle şey? Çalışmadığı şekliyle çalışmasını bekleyip duralım.

Anladığım kadarıyla kutucuğa büyülü sözler yazıp f4'e basınca o büyülü sözleri ışık hızında yazdırmak istiyorsunuz.

Farklı şeyler yazabileceğiniz için try-except gerekiyor muhtemelen. O olmadan da denersiniz.

Kod:
from pynput import keyboard
from tkinter import *
import pyautogui


def yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi():
    geting = otoentry.get()
    pyautogui.typewrite(geting, interval=0.0000001)


def on_pressed(key):
    try:
        if key.name == "f4":
            yazi_olmamasi_gereken_ama_niyeyse_yazi_olan_yazi()
    except:
        pass


master = Tk()
master.title('Auto Writer')
icon = PhotoImage(file="Adsiz.png")
master.iconphoto(False, icon)
canvas = Canvas(master, height=200, width=400, bg='#000000')
canvas.pack()
master.resizable(width="FALSE", height="FALSE")
frame_sol = Frame(master, bg='#191919')
frame_sol.place(relx=0.01, rely=0.01, relwidth=0.25, relheight=0.98)
frame_sag = Frame(master, bg='#191919')
frame_sag.place(relx=0.74, rely=0.01, relwidth=0.25, relheight=0.98)
frame_main = Frame(master, bg='#191919')
frame_main.place(relx=0.27, rely=0.01, relwidth=0.46, relheight=0.98)
frame_start = Frame(frame_main, bg='#191919')
frame_start.place(relx=0.1, rely=0.14, relheight=0.06, relwidth=0.21)
otoentry = Entry(frame_main, font='Square 11 bold', width=20, bd=0, bg='#505050')
otoentry.place(relx=0.06, rely=0.04)
yazi = Label(frame_main, text='Start button is (F4)', bg='#191919', fg='#ffffff')
yazi.place(relx=0.08, rely=0.18)

listener = keyboard.Listener(on_press=on_pressed)
listener.start()

master.mainloop()
Keyboard kütüphanesinde listener var. Onlara iyi bakın. Söylendiği şekilde çok kaynak tuketmemesi lazım.
Bu şekilde sürekli o if çalışıyor. Orada if 1 == 2 olsa da aynı şekilde çalışırdı. Gerçi compiler optimize ederdi herhalde.
 
Python:
def key_listener():
    while True:
        if keyboard.is_pressed('f4'):
            yazi()
listener = threading.Thread(target=key_listener)
listener.start()
Yazdığım programda bu kısım çok fazla CPU tüketilmesine neden oluyor, bu kısıma alternatif olarak ne yapabilirim? Yapmak istediğim şey ise "F4" tuşuna basılınca kodların tetiklenmesi.
Fonksiyon sonsuz döngüye sahip. Sürekli klavyeden gelen girdiyi kontrol ediyor.
 
Ben size makul çözümleri sunayım kararı siz verin.
1) En iyi yöntem olmasada time.sleep(.1) kullanabilirsiniz.

2) f4 tuşunu dinliyor olmanız beni interrupt'lardan yararlanabileceğiniz düşüncesine itti. Interrupt kullanan bir algoritma kurabilirsiniz.

3) Yaptıkları iş gereği fazla kaynak tüketmemesi beklenebilecek hot key kütüphanelerinden birini kullanabilirsiniz.
 
Fonksiyonun zaten sürekli kontrol etmesi lazım. Amaç o.
Sleep kullanmak yapılabilecek en kötü şeylerden biri. %99 kacinilabilir.
Zaten interrupt oluşturmayı amaçlıyor.
Kutuphane doğru. Muhtemelen kullanımı yanlış. Yarın bilgisayar başında bakarım. Şimdi kaynak atsam yabancı dil deyip uyarı bile verirler.
 
Fonksiyonun zaten sürekli kontrol etmesi lazım. Amaç o.
Sleep kullanmak yapılabilecek en kötü şeylerden biri. %99 kacinilabilir.
Zaten interrupt oluşturmayı amaçlıyor.
Kutuphane doğru. Muhtemelen kullanımı yanlış. Yarın bilgisayar başında bakarım. Şimdi kaynak atsam yabancı dil deyip uyarı bile verirler.
Hocam bahettiğim interrupt sigint tarzı signals ile elde edilen interruptlar. Standard Signals (The GNU C Library)

Operating system yürütülen her bir satır koddan sonra bu interruptları kontrol ettiği için while True ile dinlemeye gerek kalmadan çeşitli I/O işlemlerini dinleyebilmeliyiz.

Açıkcası while True ile event dinlemek bana mantıklı gelmiyor. Arkadaş kütüphaneyi yanlış kullanıyor, bu interrupt muhabbetini kütüphane kendi içinde zaten yapıyor bu da bir seçenek tabiiki.



Evet muhtemelen arkadaş kütüphaneyi yanlış kullanıyor.
Python:
from pynput import keyboard

def on_press(key):
    if key == keyboard.Key.esc:
        return False  # stop listener
    try:
        k = key.char  # single-char keys
    except:
        k = key.name  # other keys
    if k in ['1', '2', 'left', 'right']:  # keys of interest
        # self.keys.append(k)  # store it in global-like variable
        print('Key pressed: ' + k)
        return False  # stop listener; remove this if want more keys

listener = keyboard.Listener(on_press=on_press)
listener.start()  # start to listen on a separate thread
listener.join()  # remove if main thread is polling self.keys
 
Son düzenleme:
Hocam bahettiğim interrupt sigint tarzı signals ile elde edilen interruptlar.
Adam niye tekerleği yeniden icat etsin? Üstüne kurulu kütüphane var. Low level uğraşacak olsa Python kullanmaz. Sistem programlama bilen birisi dokümantasyon okumayı bilip böyle konular açmaz.
 
Python:
def key_listener():
 while True:
 if keyboard.is_pressed('f4'):
 yazi()
listener = threading.Thread(target=key_listener)
listener.start()
Yazdığım programda bu kısım çok fazla CPU tüketilmesine neden oluyor, bu kısma alternatif olarak ne yapabilirim? Yapmak istediğim şey ise "F4" tuşuna basılınca kodların tetiklenmesi.

Sonsuz döngüye sokuyorsun. Bellek sürekli allocate oluyor ve CPU kullanımı da artıyor.

Bunun yerine Update metotları ya da dinleyiciler varsa onları kullanın.

JAVA'da ActionListener, KeyboardListener ve Timer sınıfıları;
Unity3D'nin MonoBehevior sınıfının Update, OnMouse metotları gibi.

Yılanda da vardır. Ben bir kere PyGame kütüphanesinin update metodunu kullanmıştım.
 
Son düzenleme:
@Karşıt Madde adam da onu soruyor zaten.

Niye bir while ekleme gereği duyduğunuzu anlamadım. is_pressed() olan kütüphane güncellenmiyor. Gerçekten lazımdeğilse bunu kullanırdım.
Kod:
from pynput import keyboard

def on_pressed(key):
    if key.name == "f4":
        print("elma")

listener = keyboard.Listener(on_press=on_pressed)
listener.start()
listener.join()
İlla onu istiyorum diyorsanız.
Kod:
import keyboard

keyboard.add_hotkey('f4', lambda: print('elma'))
keyboard.wait("esc")
 

Technopat Haberler

Yeni konular

Geri
Yukarı