• 11-07-2014, 02:59:27
    #1
    Metin2'nin pyhton ile kodlanan kısmından bir py dosyasını değiştirerek oyuncuya her mesaj geldiğinde internet sitesinde bir php sayfasına mesajı post ile göndertmeyi denedim ama bir süre sonra oyunda donma oldu yani oyun bağlantı sırasında duruyor ve verinin post edilmesini bekliyor sonra devam ediyor bu da bir süre sonra oyunun donup kapanmasına kadar gidiyor.
    Benim istediğim arkaplanda post gönderilirken python kodlarının bu gönderimi beklemeden devam etmesi ve gönderirken hata olursa hiçbir şeyi etkilememesi
    Umarım anlatabilmişimdir.
  • 11-07-2014, 19:13:49
    #2
    alialparslan adlı üyeden alıntı: mesajı görüntüle
    Metin2'nin pyhton ile kodlanan kısmından bir py dosyasını değiştirerek oyuncuya her mesaj geldiğinde internet sitesinde bir php sayfasına mesajı post ile göndertmeyi denedim ama bir süre sonra oyunda donma oldu yani oyun bağlantı sırasında duruyor ve verinin post edilmesini bekliyor sonra devam ediyor bu da bir süre sonra oyunun donup kapanmasına kadar gidiyor.
    Benim istediğim arkaplanda post gönderilirken python kodlarının bu gönderimi beklemeden devam etmesi ve gönderirken hata olursa hiçbir şeyi etkilememesi
    Umarım anlatabilmişimdir.
    Bu sorun programınızın o blokta "single-threaded" olarak çalışmasından kaynaklanıyor. Sorunu çözmek için çeşitli yöntemler bulunsa da en hızlı ve kolay yol "multi-threaded" işlem seçeneğinidir. Buna ek olarak işlemleriniz çok kısa ise "thread pool" oluştuma yöntemi genellikle daha performanslı ve az kaynak tüketebilir ancak biraz daha tecrübe ve ayarlama gerektirmektedir.

    Pratikte yaptığınız işlem şudur;

    import time;
    
    def m1():
        print('1');
    
    def m2():
        time.sleep(2);
        print(2);
    
    def m3():
        print(3);
    
    m1();
    m2();
    m3();
    Çıktı;
    1
    2
    (2 saniye donma)
    3
    Mantık;
    |
    1
    |
    2
    |
    3
    |
    |
    m1 metoduna kadar normal işlemler gerçekleşiyor. Ancak siz programın normal akışı içerisinde kendi yazdığınız m2 methodu ile müdahale ediyorsunuz(mesaj gönderiyorsunuz) ve bu metodun çalışması(mesajın gönderilmesi) uzun sürüyor. m2 metodu işini bitirdiğinde(size mesajı göndermeyi tamamladığınızda) program normal akışına devam ediyor. Yukarıdaki örnekte program m2 metoduna geldiğinde 2 saniye kadar bekliyor. Bu süreyi ağ işleminin tamamlanması için geçen süre olarak düşününün. 2 saniye sonra m3 metodu çalışıyor ve ekrana "3" yazısı çıkıyor.

    Buradan itibaren sizin yapmayı isteyeceğiniz şey m2 metodunun programın akışını etkilememesini sağlamak olmalı. Bu yüzden m2 metodunu çalıştıracak yeni bir "thread" oluşturmanız gereklidir.

    import time;
    import threading;
    
    def m1():
        print('1');
    
    def m2():
        time.sleep(2);
        print(2);
    
    def m3():
        print(3);
    
    m1();
    t = threading.Thread(target=m2);
    t.start();
    m3();
    Çıktı;
    1
    (Donma yok)
    3
    (Mesaj gönderme işlemi başka bir thread tarafından bitiriliyor)
    2
    Mantık;
    |
    1
    | \
    3  2
    |
    Bu şekilde m2 (mesaj gönderme) metodunun tamamlanması için gereken süre ya da m2 metodunda(alt "thread"da demek daha doğru olur) ortaya çıkacak bir hata ("runtime" hataları) ana programın(üst "thread" demek daha doğru olur) akışını etkilemez.
  • 11-07-2014, 23:20:20
    #3
    PsiCat adlı üyeden alıntı: mesajı görüntüle
    Bu sorun programınızın o blokta "single-threaded" olarak çalışmasından kaynaklanıyor. Sorunu çözmek için çeşitli yöntemler bulunsa da en hızlı ve kolay yol "multi-threaded" işlem seçeneğinidir. Buna ek olarak işlemleriniz çok kısa ise "thread pool" oluştuma yöntemi genellikle daha performanslı ve az kaynak tüketebilir ancak biraz daha tecrübe ve ayarlama gerektirmektedir.

    Pratikte yaptığınız işlem şudur;

    import time;
    
    def m1():
        print('1');
    
    def m2():
        time.sleep(2);
        print(2);
    
    def m3():
        print(3);
    
    m1();
    m2();
    m3();
    Çıktı;
    1
    2
    (2 saniye donma)
    3
    Mantık;
    |
    1
    |
    2
    |
    3
    |
    |
    m1 metoduna kadar normal işlemler gerçekleşiyor. Ancak siz programın normal akışı içerisinde kendi yazdığınız m2 methodu ile müdahale ediyorsunuz(mesaj gönderiyorsunuz) ve bu metodun çalışması(mesajın gönderilmesi) uzun sürüyor. m2 metodu işini bitirdiğinde(size mesajı göndermeyi tamamladığınızda) program normal akışına devam ediyor. Yukarıdaki örnekte program m2 metoduna geldiğinde 2 saniye kadar bekliyor. Bu süreyi ağ işleminin tamamlanması için geçen süre olarak düşününün. 2 saniye sonra m3 metodu çalışıyor ve ekrana "3" yazısı çıkıyor.

    Buradan itibaren sizin yapmayı isteyeceğiniz şey m2 metodunun programın akışını etkilememesini sağlamak olmalı. Bu yüzden m2 metodunu çalıştıracak yeni bir "thread" oluşturmanız gereklidir.

    import time;
    import threading;
    
    def m1():
        print('1');
    
    def m2():
        time.sleep(2);
        print(2);
    
    def m3():
        print(3);
    
    m1();
    t = threading.Thread(target=m2);
    t.start();
    m3();
    Çıktı;
    1
    (Donma yok)
    3
    (Mesaj gönderme işlemi başka bir thread tarafından bitiriliyor)
    2
    Mantık;
    |
    1
    | \
    3  2
    |
    Bu şekilde m2 (mesaj gönderme) metodunun tamamlanması için gereken süre ya da m2 metodunda(alt "thread"da demek daha doğru olur) ortaya çıkacak bir hata ("runtime" hataları) ana programın(üst "thread" demek daha doğru olur) akışını etkilemez.
    Çok teşekkür ederim hocam aradığım bu sanırım
    Bir de bu threadlar kendiliğinden kapanır mı işlem bitince yani belki de dakikada 50 tane basit işlem yapan thread açılmış olacak da
  • 12-07-2014, 08:05:45
    #4
    alialparslan adlı üyeden alıntı: mesajı görüntüle
    Çok teşekkür ederim hocam aradığım bu sanırım
    Bir de bu threadlar kendiliğinden kapanır mı işlem bitince yani belki de dakikada 50 tane basit işlem yapan thread açılmış olacak da
    Evet, bir "thread" üzerine yüklenmiş olan işler tamamlanınca o "thread" kendiliğinden "ölür" ve GC bu "thread" ile ilişkili olan hafızayı temizler. Bu konuda fazladan bir şey yapmanıza gerek yok.
  • 21-01-2015, 02:59:48
    #5
    Üyeliği durduruldu
    PsiCat adlı üyeden alıntı: mesajı görüntüle
    Evet, bir "thread" üzerine yüklenmiş olan işler tamamlanınca o "thread" kendiliğinden "ölür" ve GC bu "thread" ile ilişkili olan hafızayı temizler. Bu konuda fazladan bir şey yapmanıza gerek yok.
    üstad selamlar pyhton ile çalışan bir sistemde ufak bir hata alıyoruz , acaba yardımcı olma ihtimaliniz var mı ?
  • 21-01-2015, 23:22:05
    #6
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Yapılan bir hatada bu tip yapılan bütün işleri tek bir betiğe yükleme çalışmasıdır bu yapmak istediğiniz işlemi ayrı bir betik te yapabilirsiniz thread larla uğraşmak zorunda kalmazsınız. Sonuçta linux sistemler kullanıyor iseniz linux sistemler gerçek multithread sistemlerdir.