Python sayaç için yardım

Merhaba arkadaşlar. Bir proje üzerinde çalışıyorum ancak kodlar çalışıyor haldeyken bir sayaç kullanmam gerekiyor ve bu sayaç mesela 3 saniye geçtiğinde 3 saniye geçtiğini belirtecek ve servo motorlar ona göre çalışacak. time.sleep kullanamam çünkü kullanırsam tüm kod bloğu duruyor.
İnternette bayağı bir araştırdım ancak basit bir sayacı nasıl ekleyeceğimi bulamadım.
Yardımcı olabilirseniz çok sevinirim.
Teşekkürler

import time

start_time = time.time()
while True:
    end_time = time.time()
    elapsed_time = end_time - start_time
    if elapsed_time >=3 and elapsed_time <= 4:
        print("3 Saniye geçti")
    

Böyle bir şey yaptım şu an için daha optimize halini yapabilen varsa lütfen söyleyebilir mi ? Teşekkür ederim

Merhabalar.
Python’da eş zamanlı işlemler için genelde threading kullanırız ama servo motorda kullanmak için nasıl bir yol izleyeceğiniz anlayamadım.

Hocam aslında time.sleep fonsiyonunu multiprocess ile çalıştırmak istedim ancak program bu sırada durdu. Demek istediğim şey eş zamanlı işlem de işe yaramadı .Time.sleep kompleks programlarda çok tehlikeli olabiliyor.

Multi-thread ve Multi-process zaman zaman farklı davranabiliyorlar.

Eş zamanlı işlem de işe yaramadıysa mecburen programın durmasına izin verilmesi gerekiyor.

Ya da asenkron bir şekilde çalıştırmayı deneyebilirsiniz:

Hocam raspberry kullanıyorum multiprocesse dahil bir sürü işlem var ve asenkron çalıştırırsam cihaz eriyebilir :joy: Sanırım üstteki kodla devam edeceğim. Yardımınız için çok teşekkür ederim hocam.

1 Beğeni

Ne icin daha optimize?

Her halukarda, optimize etmeye baslamadan once servo motor calistirmak gibi diger onemli gereksinimleri yerine getirmesini saglamak lazim. Ornek kodu “optimize etmek” kimsenin bir isine yaramaz.

Asagidaki, yukaridakini cevaplamiyor. Servo motordan kasit nedir? Niye time.sleep cagirmakta diretiyoruz, yukaridaki kodun cozemedigi neyi cozmeye calisiyoruz??

Kodda hata yapilmis demek ki.

Onceki soru cevaplanmadigi, tasarlanmasi istenen sistem/problemli sistem anlatilmadigi icin eksik bilgiyle verilebilecek en iyi cevap olan genel cevap verilmis burada.

Bu noktada sistem hakkinda fikir sahibi oluyoruz: Raspberry Pi uzerinde servo motor kontrolu yapan, bunun icin multiprocessing modulu ve tahminen en az bir kutuphane daha kullanan bir sistem var.

Lakin gel gor ki soruyu cevaplamaya baslayabilecek bilgiyi kazandigimiz bu noktada konu kapatilmis. Bosa gecen vaktimize yanip devam ediyoruz.

Kolay gelsin.

1 Beğeni

Zamanınızın boşa gideceğini düşünüyorsanız yanıtlamadan geçebilirsiniz. Siz yazmasanız da çok bir şey kaybetmem zaten. Zira siz sorunun ne olduğunu anlamazken üstteki arkadaş anlamış mesela. Asenkron çalıştırmak çok mantıklı ancak üstte de dediğim gibi çok fazla işlem yükü halihazırda var dolayısıyla asenkron çalıştırmak optimize yani hızlı çalışan bir sistem oluşturmuyor.
Kodlarda herhangi bir hata yok. Time sleep çağırmakta diretmiyorum zira üstte çözüm olarak işaretlediğim kod time sleep değil. Thread ve multiprocess kütüphanesi ile de bir çözüme ulaşamıyoruz.

Merhaba.

Kodlar çalışıyorken biz zamanlayıcı kullanmanın en kolay yolu threading i zamanlamaktır.

Timer yani zamanlayıcıların en yaygın özelliği zaten belirtilen süre sonunda bir işlemi başlatmaktır. Bunun için de ana döngü dışında bir thread içinde zaman kontrolünü kendi yapmasıdır.

Ona göre çalışacak ne demek? 3 saniye mi çalışacak, üç saniye sonunda mı çalışacak?

Evet durur çünkü programınızın ana döngüsünde çalıştırıyorsunuz ve çağrı ile alt rutinde dahi kullansanız, geri ana rutine dönemez.

Sayaç şeklinde ararsanız tabi ki bulamazsınız. Zamanlayıcı, interval, timer gibi periodically gibi anahtar kelimelerle gayet rahat alternatifler bulunabiliyor.

Yukarıdaki kısım Düzenleme yapmadan önceki halindeki sorunuz için.

Evet optimize edebiliriz.

Mesela while döngüsü içerisinde olduğunuz sürece ki sonsuz döngü kurmuşsunuz while True kullanmakla bu durumda timer.sleep de olduğu gibi bu döngü sonsuza kadar döner ve döngü içinden çıkamazsınız.

En azından ben İlk sorunuzda şikayet ettiğinizden farklı bir çözüm üretmez.

Sleep insaflıdır süre gidince serbest bırakır ama şu an sizin verdiğiniz ikinci düzeltmenizdeki while döngüsü hiç bir şekilde çıkış vermiyor.

Tabi ki durur, zaten sleep bu işe yarar kodu belirlenen süre kadar durdurur. Ama multiprocess ile nasıl durdu? Bir proces başlattınız ve ana koda döndünüz neden sleep de dursun?

Örnek kod varsa üzerinde konuşulabilir.

Eş zamanlı işlem eş zamanlı çalışır, işe yaramayan sizin kodu yazma şeklinizdir.

Neden tehlikeli olsun?

Ne işlem yaparsanız yapın, ilave bir thread ile raspberry’yi eritemezsiniz.

O while döngüsünün içine girip de çıkabilirseniz tabi ki kullanabilirsiniz. Yalnız bu haliyle o döngünden hiç bir çıkış yok.

Bunlar ufak önemsiz detaylar bunların hepsi çözülür.

Dünyanın en performansız çözüm şekli while loop kullanmaktır.

Bir thread dahi işlemci zamanlamasında daha düzgün yönetilir.

Bu da ayrı bir mevzu da asıl şu kısım dikkatimi çekti.

Zamanımız şöyle boşa gidiyor. Mesajı görüyoruz, tam bir çözüm eklemek istediğimizde mesaj editleniyor. Sonra ne istediği belli olmayan, sorarken sayaç dediği için bir timer istediğini bile ifade edememiş birinin yardıma ihtiyacı olduğunu düşünüyoruz. Biraz bilgi verelim istiyoruz.

Tam iki satır bir şey yazacakken ki, konu artık sizin kişilsel probleminiz olmaktan çıkıp, benzer sorun yaşayanlara da fayda sağlansın diye emek harcanacakken böyle bir yorum görüyoruz.

Çok şey kaybedersin.

Çünkü gayet mantıklı makul ve anlaşılır öneriler ve yol gösterici sorular var yorumlarda.

Bu sizin yorumunuz.

Mesela nasıl ölçtünüz bunu?

Bana ölçüm metodunuzu performans değerlerinizdeki değişimlerin kıyaslamasını biraz açıklar mısınız?

Kodlarınızda sleep kullanabilirsiniz, kodlarınızda hata olmasa ikinci bir thread başlattığınızda sleep ana threadinizi durdurmaz. sadece kendi threadini durdurur. Bu konuda iddialı iseniz, basit bir rasbperry pi pico gibi küçük bir kartta bile rahatlıkla yapabiliriz.

Ki konu bir microcontroller ise daha çok bilgi gerekir.

Zaten konunuz ve sorunuz her yönü ile eksik. Nasıl bir pi?

Üzeride bir işletim sistemi mi var yoksa doğrudan bir micropython kodu ile mi çalışıyorsunuz belli değil.

Her kontrolcünün, watchdog ve timer interrupt özellikleri de vardır. Yani donanımsal olarak bile zamanlanmış olaylar oluşturabilirsiniz.

Bu nedenle size sorulan,

Yukarıdaki tavsiye gayet açık.

Size der ki, örnek kodu nasıl optimize edelim. Kodu görmüyoruz. Nereden çağırdığınızı görmüyoruz. Kodun gerisini görmüyoruz.

Evet ulaşamıyorsunuz çünkü nasıl yapacağınızı bilmiyorsunuz, ve size anlatmaya çalışanları da dinlemiyorsunuz.

mesela 9. The Timers — MicroPython latest documentation

pico da dahi multithread hiç bir sorun çıkarmaz.

Hatta iki çekirdeği ayrı ayrı da kullanabilirsiniz.

Yada pi 3 B+ gibi bir kartta;

Raspberry Pi 3 B+ - python threading Timer call inconsistent on boot up - Raspberry Pi Forums

import threading

def printit():
  threading.Timer(3.0, printit).start()
  print ("Hello, World!")

printit()

print("arada yazdır")


Bu kadar. Atarsınız threading timer geçer her 3 saniyede bir çağırır kodu.

Sayısız çözüm var neticede.

Yani sorunuz soru değil, çözümünüz çözüm değil.

Bir de üzerine size yol göstermeye çalışan birine

Demişsiniz.

Aslında çok şey kaybettiniz o ayrı mevzu da.

Burada yazılanlar size özel himzet şeklinde değil.

Siz yanlışınızda inat etmek isterseniz saygı duyarız ama birileri doğruları öğrenmek isterse müsade edin de boşa gidecek zamanımız onların doğrsunu öğrenmesi adına kullanalım.

Zira işaretlediğiniz çözüm mesajında kod da yok.

Ama performansı nasıl ölçtüğünüzü ve o while döngüsünden 3 saniye boyunca beklerken nasıl çıkacağınızı çok merak ettim.

1 Beğeni