Python döngü problemi

MoRPHeuZz

Hectopat
Katılım
16 Nisan 2019
Mesajlar
24
Yazdığım kodda birden çok olay var ve hepsi while true içerisinde yer alıyor.
Diyelim ki 10 komutum var, ben bunun 5 tanesini 5 saniyede bir diğer 5 tanesini 30 saniyede bir çalışmasını istiyorum time. Sleep işe yaramıyor burada çünkü kod beklemeye geçiyor.
Sürekli olarak 5 komut 5 saniyede bir çalışsın diğer 5 komut ise 30 saniyede bir çalışsın.
Şöyle düşünün iki farklı py dosyasını time. Sleep ile çalıştırdığımı düşünün ama ben bunu tek py içerisinde yapmak istiyorum, ve kod gereksiz yere beklesin istemiyorum.
Yüksek ihtimal kimse anlamadı demek istediğimi yazdığım şeylere bakarak ama en açıklayıcı böyle yazabildim.
 
Son düzenleyen: Moderatör:
Ne demek istediğini anladık. Bunun için Multi-Thread yönetimine bakman gerekli. Alternatif olarak tek thread üzerinde de bunu yapabilirsin ama biraz trick ihtiyacın var.

Multi-thread'de iki farklı döngüyü farklı thread olarak ataman yeterli. Bu sayede iki farklı döngün iki farklı işlemci çekirdeğinde çalışacak.

Tek thread (şu anda kodlamaya çalıştığın gibi yani) yapmak istiyorsan ipucu şurada: Sayaç kullanmak. Tüm döngünün en dışarısına iki adet başlangıç zamanı değeri (birisi 5sn'lik için, diğeri 30sn'lik için) tanımlayacaksın. Bu tanıma datetime kütüphanesini kullanarak mevcut zamanı atayacaksın. Hemen ardından en dışarı yine bir While döngüsü açacaksın ve bu yapmak istediğin döngüleri bunun içerisine yerleştireceksin. While içerisinde ise döngü zamanı kontrolü için bir değişken tutacaksın. 2 adet if yapısı ile 5sn'lik ve 30sn'lik yapıları çalıştıracaksın. :)

[CODE lang="python" title="Örnek Single-Thread"]from datetime import datetime

5sn = datetime.now()
30sn = 5sn

while True:
kontrol = datetime.now()

if (kontrol - 5sn) >= 5:
'''
5 saniyede bir yaptırmak istediğini buraya yaz
'''
if (kontrol - 30sn) >= 30:
'''
30 saniyede bir yaptırmak istediğini buraya yaz
'''
[/CODE]
 
Ne demek istediğini anladık. Bunun için multi-thread yönetimine bakman gerekli. Alternatif olarak tek thread üzerinde de bunu yapabilirsin ama biraz trick ihtiyacın var.

Multi-thread'de iki farklı döngüyü farklı thread olarak ataman yeterli. Bu sayede iki farklı döngün iki farklı işlemci çekirdeğinde çalışacak.

Tek thread (şu anda kodlamaya çalıştığın gibi yani) yapmak istiyorsan ipucu şurada: Sayaç kullanmak. Tüm döngünün en dışarısına iki adet başlangıç zamanı değeri (birisi 5Sn'lik için, diğeri 30Sn'lik için) tanımlayacaksın. Bu tanıma datetime kütüphanesini kullanarak mevcut zamanı atayacaksın. Hemen ardından en dışarı yine bir while döngüsü açacaksın ve bu yapmak istediğin döngüleri bunun içerisine yerleştireceksin. While içerisinde ise döngü zamanı kontrolü için bir değişken tutacaksın. 2 adet if yapısı ile 5Sn'lik ve 30Sn'lik yapıları çalıştıracaksın. :)

[CODE lang="python" title="Örnek Single-Thread"]from datetime import datetime.

5sn = datetime.now()
30sn = 5sn.

while True:
kontrol = datetime.now()

if (kontrol - 5sn) >= 5:
'''.
5 saniyede bir yaptırmak istediğini buraya yaz.
'''.
if (kontrol - 30sn) >= 30:
'''.
30 saniyede bir yaptırmak istediğini buraya yaz.
'''.
[/CODE]

Peki bunu yapmam bir süre sonra kodlarda çakışma yaratmaz mı? Çünkü 5 saniye bir süre sonra 30 saniyeye denk gelecek ve 2 kod aynı anda çalışacak her 6 adet 5 saniye işlemden sonra 30 saniyelik kod ile diğer 5. saniye aynı anda çalışmayacak mı yaptığım şey bir komut bitmeden diğer komuta geçerse patlayacak bir şey çünkü şu an test edemiyorum kusura bakmayın sadece sormak istedim.
 
Thread diye alt islemleri yaptiran bir dongu vardi. Onu arastirsana bir kanki.
bu işlem şu alttakini engeller mi peki?
Peki bunu yapmam bir süre sonra kodlarda çakışma yaratmaz mı? Çünkü 5 saniye bir süre sonra 30 saniyeye denk gelecek ve 2 kod aynı anda çalışacak her 6 adet 5 saniye işlemden sonra 30 saniyelik kod ile diğer 5. saniye aynı anda çalışmayacak mı yaptığım şey bir komut bitmeden diğer komuta geçerse patlayacak bir şey çünkü şu an test edemiyorum kusura bakmayın sadece sormak istedim.
 
Klasik scheduling/threading problemi. Bunlari arastirarak sonuca gidebilirsin.
Eger paralel calistirman gerekmiyorsa 2 farkli olguyu tek thread de schedule edebilirsin.
Kod:
while condition:   
    schedule_first_task()
    schedule_second_task()
    schedule_third_task()
 
Peki bunu yapmam bir süre sonra kodlarda çakışma yaratmaz mı? Çünkü 5 saniye bir süre sonra 30 saniyeye denk gelecek ve 2 kod aynı anda çalışacak her 6 adet 5 saniye işlemden sonra 30 saniyelik kod ile diğer 5. saniye aynı anda çalışmayacak mı yaptığım şey bir komut bitmeden diğer komuta geçerse patlayacak bir şey çünkü şu an test edemiyorum kusura bakmayın sadece sormak istedim.
Hayır, çakıştırmaz. Çünkü önce 5sn'lik döngüyü tamamlayacak, o kod bloğu bitecek ve ardından 30 saniye için kontrol edecek. 30 saniyelik içinde doğruysa oradaki döngü de tamamlanacak. Sonra süreç sıfırdan işleyecek. Ek olarak o kodun sonuna bir işleç daha eklemeyi unutmuşum.

Python:
    if (kontrol - 5sn) >= 5:
        '''
             5 saniyede bir yaptırmak istediğini buraya yaz
        '''
    if (kontrol - 30sn) >= 30:
        '''
            30 saniyede bir yaptırmak istediğini buraya yaz
        '''

şu kısımdan sonra şunu ekleyin

Python:
        '''
   
   5sn = datetime.now()
   30sn = 5sn
 

Geri
Yukarı