Python İstenen süre sonunda anında program durdurmak

kkank

Hectopat
Katılım
1 Mart 2021
Mesajlar
803
Makaleler
7
Çözümler
4
Daha fazla  
Cinsiyet
Erkek
Merhaba.

Yazdığım programın bir yandan zamanı takip etmesini, verilen süre bittiği anda istediğim işlemi yapmasını istiyorum. Ancak bunu kontrol ettireceğim kodlarla yapamam, zira gerekirse bir işlem yapılırken yarıda kesmesi gerekiyor. Dolayısıyla döngüye sokup, her seferinde kontrol ettirmeden, program çalıştığı sürece bir yandan süre sayan bir çözüm var mıdır?
 
Bi thread spawnla, spawn ettigin threadi belirledigin sure boyunca uykuya sok, suresi bittiginde sys.exit() fonksiyonunu cagirip kendi dahil tum islemleri sonlandirsin.

Dikkat et kaynak temizligi yapmayacak boyle cikis yaptiginda. Kaynaklari geri alman az surebilir. Eger basit kaynaklar tuketiyorsan (ram ve cpu kullanimindan bahsediyorum), bunlar uygulama ciktiginda otomatik geri doner OS'e.

Eger daha non-trivial kaynaklar tuketiyorsa uygulaman (file handle, tcp/udp socket, websocket, etc.), bunlari salmadan (yeniden kullanima acmadan) cikis yapacak. Bunlari da OS otomatik geri alacak bi kac dongu sonra. Kac dongu olacaginin garantisi yok. Deterministic degil, heuristic (ic gudusel) calisir OS'in kaynak kontrolleri kendisine ait olmayan bir sey hakkinda fikir sahibi olmaya calistigi icin. O yuzden ne zaman kaynaklari geri almaya uygun gorduyse, o zaman geri alir.

Yerinde olsam ana isleme bi cancellation requirement eklerim, bu geldiginde ana islemin kendisini durdurur kaynaklari teslim eder vs.
 
Evet aradığım tam böyle bir şey. Sorunum şöyle ki Selenium kullanıyorum, çok fazla sayfa açma işlemi var ve bazen sayfa yüklenirken kilitleniyor. Eğer 10 saniyede açılmazsa dur ve yeniden sayfa yükle gibi bir if kullanımını nasıl yapabilirim?
 
Calisacak isi ayri bir process olarak baslat, direkt OS seviyesinde terminasyon sinyali yolla. Bu yontemle aninda isi bitirebilir, dilersen clean-up yapabilirsin graceful termination sinyali icin. Unix icin -> Termination Signals (The GNU C Library)
Windows icin de vardir benzer bir yapi.

Bir baska yaklasim event driven mimari yapmak, iptal event'i atildiginda worker routine isini bitirip gerekli temizligi yapar. Ancak bu durumda aninda termination yapamayabilirsin.

Ya da event'e benzer sekilde interrupt temelli bir mimari de yapabilirsin. Yine isletim sistemleri driver icin bolca kullanir bu yapiyi -> What is interrupt processing?

Eger isleme basladiginda ne zaman sonlandiracagin belliyse ayri bir koordinasyon thread'ine gerek duymadan timeout yapisi yazabilirsin. Bunu da her dilde kurgulamana yarayan yapilar olur. Ornegin python icin
Python:
@pytest.mark.timeout(60)
def test_foo():
    pass
pytest benzer yapiyi kullanir. Belirlenen sure icinde task tamamlanmazsa interrupt edilir.
 
Selenium'da onun icin kendi timeout ozelligi var;
Python:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException

opt = Options()
opt.timeouts = {"pageLoad": 10}
driver = webdriver.Chrome(options=opt)

try:
    driver.get("https://www.technopat.net/")
except TimeoutException:
    # Kendi sayfa yuklenemedi mantigini kurarsin burada
    pass

input("Press Enter to close the browser...")
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…