Thread overview
Concurrency ve Hata Mekanizması
May 09, 2014
Salih Dinçer
May 09, 2014
		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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 09, 2014

runTask ($func, allPeers[$-1]) ve allPeers[] nedir?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 09, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 09, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]