Uzayan işlemi sonlandırmak

Merhaba arkadaşlar tek değer alan return değer dönen bir fonksiyonum var fonksiyonum kütüphane yardımı ile web sitelerinde kontrol yapıyor kendi timeout u başarısız o konuyu uzatmıyorum benim istediğim fonksiyonum belirlediğim saniyede işlemi gerçekleştiremez ise işlemi öldürmek bunu nasıl yapabilirim.

Merhaba. Bahsettiğiniz işlem nedir?

1 Beğeni
def users(url):

    try:

        HEADERS = ({
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'DNT': '1',
            'Accept-Encoding': 'gzip, deflate, lzma, sdch',
            'Accept-Language': 'en-US, en;q=0.5'
        })

        

        browser = mechanicalsoup.StatefulBrowser()
        browser.session.headers = HEADERS

        browser.open(url, timeout=30)

        browser.select_form('form[action="{}"]'.format(trimDomain))
        
        browser["author"] = random.choice(name)
        browser["email"] = random.choice(email)
        browser["pass"] = random.choice(pass)

        browser.submit_selected()
        

        donenUrl = browser.get_url()
        return donenUrl



    except:
        
        print(url + "   Not Found")

    browser.close()

Forum giriş kontrol hocam dönen değeride ThreadPool a gönderip çoklu işlem yapıyorum burada veri akışı kitlendiği zaman ThreadPool değerleride gittikçe işlem tıkanıklığı olup bekelemede kaldığı için beklemede kalıyor kütüphanenin timeout u her bit arası verdiğim değer kadar bekliyor oda bir kontrol saatler sürebiliyor benim istediğim koddada görüldüğü gibi toplam 30 saniyede işlem hala sürüyorsa kill etmek

import time
import threading
import sys

def run():
    print("Deneme")
    time.sleep(5)

def is_finished(timeout):
    th = threading.Thread(target=run)
    th.start()
    time.sleep(timeout)
    if th.is_alive():
        print("İşlem bitmedi")
        sys.exit()
    
is_finished() 

Sizin kullandığınız modülü tam bilmiyorum ama bir fonksiyonun bitip bitmediğini böyle kontrol edebildim.

1 Beğeni

sys.exit tüm programı sonlandırır hocam ben sadece fonksiyonu sonlandırmalıyım ki ThreadPool da yer tutan işlemde tükensin yeni işleme geçebilsin.

Merhaba hocam. Threading te fonksiyonu durdurmak ile ilgili bir şey bulamadım. Multiprocessing ile şöyle bir şey yaptım:

import time
import multiprocessing
import sys

def run():
    print("Başladı")
    time.sleep(5)
    print("Bitti")

def is_finished(timeout):
    pr = multiprocessing.Process(target=run)
    pr.start()
    time.sleep(timeout)
    if pr.is_alive():
        print("İşlem bitmedi")
        pr.terminate()
    
is_finished(3)  
2 Beğeni

Threading sonlandımayacağım hocam benim fonksiyonu sonlandırmam lazım fonksiyon tamamlanamadığı için threadin kilitleniyor fonksiyonun sonlanması lazım browser.open(url, timeout=30) burada sayfa yüklenmede çok uzadığı için fonsiyon işlemide beklemede öylece kalıyor.

Şunu kullanaiblirsin

import multiprocessing
import time
def cp():
  while True:
   for i in range (20):  
    print ('Process: ', i)
    time.sleep(0.05)
x = multiprocessing.Process(target = cp)
x.start()
time.sleep(0.5)
x.terminate()
print("Terminated the child process")

bu senin deidğin gibi başlatırsın, belli bir timeout sonunda terminate edersin.

2 Beğeni

Merhaba hocam. Anladığım kadarıyla şöyle bir bir şey istiyorsunuz:

def foo():
    print("Sa") 

foo() 

Eğer foo 5 saniyeden uzun sürede sona ermezse elle kapatmak istiyorsunuz. Thread ya da multiprocessing kullanmadan bu mümkün değil. Çünkü aynı anda hem fonksiyonu çalıştırmak, hem de zamanı kontrol etmek zorundayız.

foo()
time.sleep(5)
print("İşlem bitmedi")

Burada Python kodları satır satır okuyacağından, ilk önce foo nun bitmesini bekleyecek, sonra zamanla durdurma mekanizması çalışmaya başlayacaktır. Multiprocessing i bu yüzden kullandım.

def run():
    print("Başladı")
    time.sleep(5)
    print("Bitti")

def is_finished(timeout):
    pr = multiprocessing.Process(target=run)
    pr.start()
    time.sleep(timeout)
    if pr.is_alive():
        print("İşlem bitmedi")
        pr.terminate()
    
is_finished(3)

Burada ise fonksiyonu ayrı bir processte çalıştırıp, processin çalıştığı sıra zamanı kontrol edebildik. Belirlenen timeout süresinden sonra ise fonksiyon bitmediyse process zorla duracaktır.

2 Beğeni

Hocam peki benim fonksiyon dışardan değer alıyor bu durumda pr = multiprocessing.Process(target=run) a değer ekleyebilirmiyiz. Bir başka sorumda işlem sırasında işler sürdükçe ram çok yükseliyor bunu optimize etmenin yolu nedir.

pr = multiprocessing.Process(target=run, args=('zebun',))
3 Beğeni

Fonksiyonum üstte altta ise threadpool kullandığım kodum var basit bi program olmasına rağmen 12 gb rami tüketip işlemez hale geliyor çok büyük bir liste yok ama işledikçe ram kullanımı artıyor en son dediğim şekilde oluyor hocam bu kodda ne buna neden olabilir sizce dediğim gibi fonksiyonum üstte Threadpool da alta vediğim kodlarım.

with ThreadPoolExecutor(max_workers=worker) as executor:
    for url in liste:
        processes2.append(executor.submit(users, url))

    
for task in as_completed(processes2, timeout=30):

    try:

        if task.result() != None:
            
            print(task.result() + "   Found")
            with open("listem.txt", "a") as f:
                f.write(task.result() + "\n")
            
        else:
            print("------------------------------------------------------------------")
            print(task.result())
            print(type(task.result()))
            print("------------------------------------------------------------------")

    except Exception:
        print("hata")

process leri bir array in içine atıyorsun galiba,
şimdi python da garbage collector nasıl çalışıyor bilmiyorum, mesela js de bir değişken hiçbir yere bağlı değilse o hafızadan atılır.

Sen process i tamamen yok etmediğini için memory leak oluyor olabilir.

Sonuçta çağırdığın metod process e bağlı ve process yok olmadığı için o da memory de kalıyor olabilir. Tabi fonksiyonun içindeki değişkenler de kalıyordur.

browser = mechanicalsoup.StatefulBrowser()

oluşturuyorsunya belki bu fazla ram tutuyordur. browser i global oalrak kullanabilirsin bir kere oluşturup, ya da process i tamamen yok etmeyi deneyebilirsin yani array den de temizle işlem bitince.

1 Beğeni

Başka bir projemde daha yoğun işlemlerin bulunduğu projemdede aynı process kullanıyorum orada 100 k url listelerde ramde hiç oynama yok ama burada 2 satır kodda maksimum 5 k liste ekliyorum işlem başlangıçta 2,8 ram ile başlıyor gittikçe yükseliyor sonra 12 gb rami komple kullanıyor program çökmüyor ama işlemez hala geliyor neden ram in bu kadar arttığını çözemiyorum browseri başlangıçta açarsam bu seferde bir çok farklı bağlantı hatası oluyor. Process kapatarakta denedim değişen birşey olmadı işlemleri listelerde tutmak yerine txt aktararak en azından cpu bazlı çalıştırmayı denedim oda fayda etmedi çok büyük bir işlem olmamasına rağmen 12 gb ram tüketip hala doyamamasını anlamlandıramıyorum sorunun neden kaynaklandığını tesbit edebileceğim bir test yöntemi var mı?

Bu kütüphane işinize yarayabilir:

2 Beğeni