Forum: D Programlama Dili RSS
Concurrency ve Hata Mekanizması
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Concurrency ve Hata Mekanizması
        while(allPeers.length > 0){
            if(_bitField.havePiece() == -1){
                writeln("already downloaded");
                return;
            }
            auto bf = 0;
            while(peerCount > maxPeer) {
                bf = stats.byteReceived;
                1.seconds.sleep();
                writeln(formatBytes(stats.byteReceived - bf), " per second");
            }
            auto p = allPeers[$-1];
            allPeers = allPeers[0..$-1];
            peerCount++;
            runTask((Peer peer) {
                ///debug writeln("Connecting peer: ", peer.ip, ":", peer.port);
                connectPeer(peer.ip, peer.port);
                peerCount--;
                ///debug writefln("Peer disconnected: %s:%s", peer.ip, peer.port);
            }, p);
            10.msecs.sleep();
        }

Şeklinde bir kodum var. Burada vibe.d nin runTask ını kullanarak işlemler başlatıyorum ve yukarıda 1.seconds.sleep diyen yerde programı uyutuyorum ve bu sayede aynı anda aktif olan işlem sayısını sınırlayabiliyorum.

Buraya kadar sorun yok. Sorun connectPeer işleminden bir hata fırlatıldığı zaman bunun runTask içerisinde yakalanamaması ve 1 saniye uyku verdiğim yerden fırlatılması.

Bu normal mi? Kaçırdığım bir nokta mı var?

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
runTask ($func, allPeers[$-1]) ve allPeers[] nedir?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
vibe.d ile deneyimim yok ama std.concurrency'de de benzer bir durum var: Bir iş parçacığı tarafından atılan hata bu iş parçacığı tarafından yakalanamaz. O yüzden std.concurrency atılan her hatayı yakalar, elinde tutar, ve ilk fırsatta tekrar atar. Şurada "İşçide atılan hatalar" başlığında geçiyor:

  http://ddili.org/ders/d/es_zamanli.html

Belki bu da onun gibi bir durumdur. Yine de, eğer connectPeer'in etrafına bir try-catch koyulduğunda hatanın o işlem sırasında yakalanacağını düşünüyorum. Yok eğer runTask'in etrafına koyarsan, hayır, öyle yakalanamıyor olabilir çünkü belki de runTask otomatik olarak yakalayıp sonra kendisi atmıyordur.

Başka bir olasılık, Exception türünü yakalamak istiyorsundur ama atılan Error'dır; o yüzden yakalayamıyorsundur.

Ali
Avatar
zekeriyadurmus #4
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
Hocam github linkini atayım bütün projeyi oradan rahatlıkla inceleyebilirsiniz. (Şu an hatalar olduğu için son commiti atmadım.)

allPeers benim torrenti indireceğim eşlerimin(peer) listesi.

runTask -> std.concurrency ile birlikte çalışan vibe.d modülü. Aynı anda 2 işlemin(kod bloğunun) çalışmasını sağlıyor.

connectPeer -> Eşe bağlanıp indirme işlemini başlatıyor

Orada eş listesinden her seferinde bir tane eşi pop ediyorum ve onun için bir task başlatıyorum. Bu tasklardan birinden hata döndü mü bu hatayı taskı çağıran yerden yakalıyorum bir türlü task içerisinden yakalayamıyorum.

https://github.com/Rhodeus/bittorrent

Zekeriya
Bilgi meraktan gelir...
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 17:23:10 (UTC -08:00)