İşte

2016-04-12 22 views
0

kodudur r102546 Windows 7'de Çalışıyorİşte

Bu döngü, yalnızca askıda kalmadan önce 60k ila 80k kez arasında çalışabilir. Bundan sonra hiçbir şey olmaz.

Meslektaşımın bilgisayarında belki 40k ila 60k katı. Ama bu döngü sonsuza kadar devam etmemeli mi?

İlk önce bağlantıları kurmaya yönelik uygulama zamanını test eden bir referans noktası çalıştırıyordum, bu nedenle her şey bittikten sonra ilk başta başlangıç ​​saatini ve başlangıç ​​saatini alamıyorum.

Bu, kullandığım işletim sistemi ile ilgili mi?

Sorunu bilen biri varsa teşekkürler.

================================= ============

güncelleme 2016/04/13:

bir gün sağ ben bu soruyu gündeme sonra, ben bunu ne kadar abuk bir soru fark etti. Ve gerçekten yapmak istediğim şey değildi. Bu yüzden daha fazla açıklayacağım.

Ben connections.Client 'connect' etkinliğinde bir 'setup' olayını gönderecek işleyen bir düğüm sunucu var: Burada

test yapıdır. Sunucu tarafında bir Redis abone kanalı oluşturulacak ve daha sonra db'den bazı sorgular yapılacak, ardından istemcinin 'setup' olayının geri çağrısını çağıracaktır. İstemci 'kurulum' geri aramadaki soket bağlantısını kesin ve 'bağlantı kesme' olayına tekrar bağlanın.

İstemci kodları, yüksek eşzamanlılığı simüle etmek için arka uç ve kümede çalışmak üzere socket.io istemcisini kullanır.

[server] 
socket.on('setup', function(data, callback) { 
    queryFromDB(); 
    subscribeToRedis(); 
    callback(); 
} 

[client] 
var requests = 1000; 
if (cluster.isMaster) { 
    for (var i = 0; i < 100; ++i) { 
    cluster.fork(); 
    } 
} else { 
    var count = 0; 
    var startTime = process.hrtime(); 
    socket = io.connect(...); 
    socket.on('connect', function() { 
    socket.emit('setup', {arg1:'...', arg2:'...'}, function() { 
     var setupEndTime = process.hrtime(); 
     calculateSetupTime(startTime, setupEndTime); 
     socket.disconnect(); 
    } 
    } 

    socket.on('disconnect', function() { 
    if (count++ < requests) { 
     var disconnectEndTime = process.hrtime(); 
     calculateSetupTime(startTime, disconnectEndTime); 
     socket.connect(); 
    } else { 
     process.exit(); 
    } 
    } 
} 

İlk başta bağlantıları yalnızca 500 veya 600 defa yapabiliriz (fonksiyonların bazı burada sayılmayan):

Kodlar bunlar gibidir. Bir şekilde tüm hrtime() kodlarını kaldırdım, 1000 kez yaptı. Ama daha sonra isteklerin sayısını 2000 katına çıkardım (hrtime() kodları olmadan), tekrar bitiremedi.

Tamamen kafam karışmıştı. Dün hrtime ile ilgili olduğunu düşündüm, ama tabii ki, sonsuz bir döngü asılacaktı. Hrtime tarafından yanıldım.

Ama şimdi sorun nedir?

================================= güncelleştirmesi 2016.4.19

Bu sorunu çözdüm.

İstemcim kodlarım, yeni bir kullanıcı taklit etmek için socket.disconnect ve socket.connect kullanıyor. Bu yanlış.

Bu durumda sunucu eski soketin bağlantısını kesmiş olabilir.Soket nesnesini ve yeni bir tane daha silmek zorundasın.

Bağlantı sayısının bağlantı kesme sayısına eşit olmadığını görebildiğiniz için bu, kodumuzun bağlantıyı kesmesini engeller, dolayısıyla tüm döngü, yanıt vermemesi nedeniyle askıda kalır.

+0

Sadece windows 10 üzerinde düğüm 4.2.4 denedim, bunu durdurmaya karar vermeden önce bir milyon infaz aldım .. –

cevap

0

Kodunuz sonsuz bir döngüdür - bir noktada bu her zaman sistem kaynaklarını tüketir ve uygulamanızın askıda kalmasına neden olur.

Uygulamanızın askıda kalması dışında, gönderdiğiniz kod çok az şey yapar. Esasen, böyle tarif edilebilir:

For the rest of eternity, or until my app hangs, (whichever happens first): 
    Get the current high-resolution real time, and then ignore it without doing anything with it. 
    Increment a number and log it 
Repeat as quickly as possible 

bu ne yapmak istediğini gerçekten ise - Bunu elde var, ama her zaman bir noktada askıda kalacaktır. Aksi takdirde, istediğiniz sonucu daha ayrıntılı olarak açıklamak isteyebilirsiniz.

+0

evet, ne kadar aptalca bir soru olduğunu anladım. Sorumu güncelledim plz. şimdi kendimi iyi açıklayabilir. – user3736388

+0

"bir noktada bu her zaman sistem kaynaklarını tüketir ve uygulamanızın askıda kalmasına neden olur." --- hangi kaynaklar tam olarak tükeniyor? – zerkms