Thread overview
July 20, 2013

Bir döngümüz olduğunu varsayalım ve bu döngü sonsuz bir döngü ve haliyle hiçbir zaman kapanmayacaktır.

while(1){

}

Ama 3 saniyeden uzun sürerse bu döngünün çalışması bu döngünün kırılması icap ediyorsa bunu döngü içerisinde sürekli olarak zaman kontrolü yapmadan yani sistemi yavaşlatmayacak şekilde nasıl yapabiliriz?

Teşekkürler

Zekeriya

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

July 20, 2013

O döngü bir event loop ise daha önceden kurulmuş olan bir alarmın (daha doğrusu timer'ın) çalıp çalmadığına bakar.

Kurulan timer da senin programına signal gönderir.

Daha yeni teknolojiler de vardır herhalde ama biz bunun için libevent kullanıyoruz.

Ali

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

July 22, 2013

Hocam örnek bir kod verebilme şansınız var mı?

Zekeriya

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

July 22, 2013

Soruyu RhS kapsamında sorduğunu varsayrak; bunu sunucu katmanında yapman (ayarlaman) daha doğru olur. Çünkü sonsuz döngü içinde çalışması gerek bir kod olabilir, sonra işlem sonucuna göre döngü kırılabilir ve hatta tekrar başka sonsuz bir döngüye yönlendirilebilir. Kesin ve net çözümü üst katmandaki bir bağlantı kesimidir...

Kısaca "script timeout" olanağını sunucu ayarlarından yapman etkin sonuç verebilir. Sonuçta sunucu, var olan tüm bağlantıları sonsuza dek açık tutması hiç mantıklı değil çünkü türlü saldırılara açık. Örneğin bütün portları meşgul eden biri çıkabilir ve sunucu üzerindeki barındırılan tüm sitelere ulaşılamaz olur!

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

July 22, 2013

Hocam scgi ile bağlantı kuruyorum haliyle bir tane çalışan rhs var ve ona soket ile bağlantı kuruluyor. Yani rhs ye sunucunun müdahale etmesi mümkün değil cgi olsaydı evet mümkündü ama cgi değil maalesef onun yerine rhs kısmında bu işi yapmak gerek.

Zekeriya

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

July 22, 2013

Bu deimos ilintisi ile ilgili örnek var mı?

Ali hocam aslında while döngüsü sadece temsili idi.

rhs = new RhVirtualMachine();
cgi.write(rhs.run(cgi.scriptName));

gibi bir kod main.d içerisinde çağrılıyor burada rhs.run işlemi çağırıldığı zaman 3 saniyeden uzun sürerse bir throw yapılıp hata vermesini sağlamak istiyorum.

Zekeriya

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

July 22, 2013

Ali hocam std.parallelism ile çözdüm sorunu :)

Bir paralel işlem yapıp 3 saniye sleep attım sonrada sistemi duracak kodu yazdım ve tamamdır :)

Şimdi 3 saniyeden kısa sürerse eventi silmek gerekecek.

Zekeriya

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

July 22, 2013

Alıntı (zekeriyadurmus):

>

Hocam örnek bir kod verebilme şansınız var mı?

Hazırda bildiğim bir şey değil. (Her ne kadar bizim projede kullanılıyor olsa da kodun oralarına senelerdir bakmam gerekmiyor.)

libevent (aslında, libevent2) kullanan programların bir ana döngüsü oluyor. Üzerinde çalışılması gereken her konu bu döngüde beliriyor:

http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html

Çalışılması gereken her konuya şunlar ve başkaları dahil: timeout, bir alt programın işinin bitmiş olması (SIGCHLD), vs.

libevent multithreaded değildir ama aynı anda birden çok iş yapılmasına olanak verir. Bütün işlemci çekirdeklerine gerek duymayan uygulamalara elverişlidir.

Bir kere libevent kullanılacağın karar verilmişse D'de kullanmak için Deimos'taki ilintisini düşünmek gerek:

https://github.com/D-Programming-Deimos/libevent

Doğrusu, bunun yerine senin ilk programındaki 'while(1)' döngüsünü de kullanabilirsin. Timeout için bir thread başlatırsın ve zamanın dolup dolmadığını çeşitli yollarla belirlersin:

  • std.concurrency'nin receiveTimeout()'unu kullanarak (bu çağrının zaman kaybetmesini istemiyorsan süre olarak 0 saniye vermelisin)

  • Aynı modüldeki bir değişkenin değerinin true olup olmadığına bakarak (zamanlama thread'i o değişkeni true yapar)

Ali

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