sched modülü

Bu modülün amacı belirli fonksiyonları sırayla çalıştırmaktır. Modülün içinde scheduler diye bir sınıf mevcut. (Sınıfın adı dikkat ettiyseniz küçük harfle başlıyor.) Bu modülü kullanmadan önce scheduler sınıfından bir örnek oluşturmalısınız:

import sched
s=sched.scheduler()

Örneğimizi bu şekilde oluşturabiliriz. Ancak bu şekilde oluşturmamız bize daha sonra sorun teşkil edebilir. Bu sınıfın iki tane parametresi var. Bunlardan ilki: timefunc. Bu parametrenin varsayılan değeri time.monotonic. Örnek oluşturulurken bu parametreyi time.time olarak ayarlayalım. Bunun sebebini birazdan açıklayacağım. İkinci ve son parametre ise delayfunc. Bu parametrenin varsayılan değeri time.sleep. Bu parametreyi de kodun okunaklılığı açısından belirtelim. Sonuç olarak örneğimizi şu şekilde tanımlayalım:

import sched, time
s=sched.scheduler(time.time, time.sleep)

Şimdi sıra bu örneğin metodlarında.

scheduler.enter()

Bu metod çalıştırılacak fonksiyonların sıraya eklenmesini sağlıyor. 5 tane parametresi var. İlki bekleme süresini belirliyor. İkincisi önceliğini belirliyor. Eğer aynı zamanda çalışacak fonksiyonlar varsa önceliğine göre çalıştırılır. Üçüncüsü çalışacak fonksiyon. Diğer ikisi isimli parametre. Bunlardan argument olan eğer varsa demet olarak fonksiyonun parametrelerini alıyor. Diğerinin adı da tahmin edeceğiniz üzere kwargs. Değeri de sözlük olarak fonksiyonun isimli parametreleri.

scheduler sınıfının delayfunc parametresi burada kullanılıyor.

scheduler.enterabs()

Bu metod enter metodundan çok da farklı değil. Tek farkı ilk değeri bekleme süresini değil çalışacağı süreyi belirliyor.

scheduler sınıfının timefunc parametresi burada kullanılıyor.

scheduler.cancel()

enter veya enterabs ile sıraya eklenmiş fonksiyonları sıradan çıkarmayı sağlıyor.

scheduler.empty()

Eğer sırada herhangi bir fonksiyon yoksa True döndürür. Eğer fonksiyon varsa False döndürür.

scheduler.run()

Sıradaki fonksiyonları hazırlandığı şekilde çalıştırır. Tek parametresi olan blocking eğer False ise ilk çalışacak fonksiyonun çalışmasına kalan süreyi döndürür.

scheduler.queue

Bu değişken scheduler nesnelerinin sahip olduğu ve bizim kullanabileceğimiz tek değişken. Daha önce sıraya eklenmiş Event nesnelerini tutuyor.

Örnekler

Anlatım biraz kafa karıştırıcı oldu. Ancak şimdi birkaç Örnek yaparak mantığını kavramanızı sağlayalım.

>>> import sched,time
>>> s=sched.scheduler(time.time,time.sleep)
>>> def zamanı_yazdır(sıra):
    print(f"Zaman: {time.time()} ,{sıra}")

>>> def farklı_zamanları_yazdır():
    print(time.time())
    s.enter(10,1,zamanı_yazdır,argument=("Birinci",))
    s.enter(5,1,zamanı_yazdır,argument=("İkinci",))
    s.enter(5,2,zamanı_yazdır,argument=("Üçüncü",))
    s.enter(5,1,zamanı_yazdır,argument=("Dördüncü",))
    s.run()
    print(time.time())

>>> farklı_zamanları_yazdır()
1532176259.627274
Zaman: 1532176264.6953058 ,İkinci
Zaman: 1532176264.6953058 ,Dördüncü
Zaman: 1532176264.6953058 ,Üçüncü
Zaman: 1532176269.6955397 ,Birinci
1532176269.7111597

Çalışmaya başladıktan 5 saniye sonra “İkinci”, “Üçüncü” ve “Dördüncü” çalıştı. “İkinci” ve “Dördüncü”nün sırası aynıydı. O yüzden tanımlanma sıralarına bakıldı. “Üçüncü”nün öncelik sırası 2 olduğu için onlardan daha sonra yazıldı. “Birinci” onlardan 5 saniye sonra yani çalışmaya başladıktan 10 saniye sonra çalıştı.

Bir başka örnek:

import sched,time
s=sched.scheduler(time.time,time.sleep)
yazdırılacak_değer="Merhaba Dünya"
def değiştir():
    global yazdırılacak_değer
    yazdırılacak_değer="Merhaba Zalim Dünya"

def yazdır():
    print(yazdırılacak_değer)

suan=time.time()
if(s.empty()):
    s.enterabs(suan+5,1,yazdır)
    s.enterabs(suan+6,2,değiştir)
    s.enterabs(suan+6,1,yazdır)
    s.enter(10,1,yazdır)
s.run()

if bloğunda eğer sıra boşsa çalışmasını söyledik. Sıra boş olduğu için altındaki fonksiyonlar çalışacaktır. İlk önce 5 saniye sonra bir kere yazdır fonksiyonu çalışacaktır. Daha sonra çalışmaya başladıktan 6 saniye sonra ikinci yazdır fonksiyonu çalışacaktır. Çıktısı ilkiyle aynı olur. Ancak hemen sonra çalışan değiştir fonksiyonu ile yazdırılacak_değer değiştiği için 10. saniyede çalışan yazdır fonksiyonu farklı bir çıktı veriyor.

Şu şekilde fantastik bir döngü oluşturulabilir:

import sched,time
s=sched.scheduler(time.time,time.sleep)
suan=time.time()
def çıktı():
    global suan
    suan+=2
    print(suan)
    s.enterabs(suan,1,çıktı)

s.enter(5,1,çıktı)
s.run()

Her iki saniyede bir aynı kod çalışacaktır. Eğer 2’yi değiştirirseniz süreyi de düzenlemiş olursunuz.

Yorumlar

Önemli Not

Sorularınızı yorumlarda dile getirmek yerine Yazbel Forumunda sorarsanız çok daha hızlı cevap alabilirsiniz.
Belgelerdeki bir hata veya eksiği dile getirecekseniz lütfen yorumları kullanmak yerine Github'da bir konu (issue) açın.
Eğer yazdığınız yorum içinde kod kullanacaksanız kodlarınızı <pre><code> etiketleri içine alın. Örneğin:
        <pre><code class="python">
        print("Merhaba Dünya!")
        </code></pre>