2013-12-12 12 views
7

Libuv'da, çalışan iş parçacıklarını çok fazla iş veya buggy koduyla bağlayabilirsiniz. İşçi iş parçacığının veya iş parçacığının sırasının sağlığını kontrol edebilen basit bir işlev var mı? % 100 deterministik olmak zorunda değildir; sonuçta, çalışan iş parçacığının yavaş kodda mı yoksa sonsuz bir döngüde mi asılı kaldığını belirlemek imkansızdır.libuv worker thread veya work queue sağlık kontrolü?

Yani şu sezgisel herhangi iyi olurdu: sıraya öğelerin

  • sayısı henüz çalıştı değil. Bu çok büyükse, çalışan iş parçacığı meşgul veya asılı olduğu anlamına gelebilir.

  • Libuv'un, iş parçacığının n saniye içinde tekrar kontrol etmemesi durumunda herhangi bir iş parçacığı öldürme mekanizması var mı?

+0

libuv'u node.js uygulamasının bir parçası veya bağımsız olarak mı kullanıyorsunuz? –

cevap

1

Bu işlev libuv'un kendisinde mevcut değildir ve ben böyle bir şey sağlayan herhangi bir OSS'nin farkında değilim. bir öldürme mekanizması açısından

, hiçbiri libuv içine orada pişirilir, ancak http://nikhilm.github.io/uvbook/threads.html#core-thread-operations öneriyor: İyi tasarlanmış program zaten yürütme başladı işçi çalıştıran uzun sonlandırmak için bir yol olurdu

. Böyle bir işçi periyodik olarak, sadece ana işlemin sinyal sonlandırmasına ayarladığı bir değişkeni kontrol edebilir. Bu nodejs içinse

-1

, basit bir monitör iplik yapardınız? Olay kuyruğu içi hakkında bilgi almanın bir yolunu bilmiyorum, ancak iş parçacığının zamanında çalıştırıldığını izlemek için olay kuyruğuna bir izleyici enjekte edebilirsiniz. (Bu konu zamanında çalıştırıldığı olup olmama durumuna göre henüz çalışmaz parçacığı sayısına göre yük ölçer, ancak. Aynı şey, bir bakıma.)

bir monitör iplik olabilir yeniden kuyruk kendisini ve onu çağrılan kontrol En az her 10 milisaniye (veya maksimum kümülatif engelleme ms'ye izin verilir) izin verilir. Nodej iş parçacığı yuvarlak robin çalıştırdığı için, monitör iş parçacığı zamanında çalıştırılmışsa, diğer tüm iş parçacıklarının aynı 10 ms'lik pencerede çalışma şansı olduğunu söyler. (Düğümünde) gibi bir şey:

// like Date.now(), but with higher precision 
// the extra precision is needed to be able to track small delays 
function dateNow() { 
    var t = process.hrtime(); 
    return (t[0] + t[1] * 1e-9) * 1000; 
} 

var _lastTimestamp = dateNow(); // when healthMonitor ran last, in ms 
var _maxAllowedDelay = 10.0;  // max ms delay we allow for our task to run 
function healthMonitor() { 
    var now = dateNow(); 
    var delay = now - _lastTimestamp; 
    if (delaly > _maxAllowedDelay) { 
     console.log("healthMonitor was late:", delay, " > ", _maxAllowedDelay); 
    } 
    _lastTimestamp = now; 
    setTimeout(healthMonitor, 1); 
} 

// launch the health monitor and run it forever 
// note: the node process will never exit, it will have to be killed 
healthMonitor(); 

uyarı mesajları kısma ve temiz bir kapatma destekleyen bir egzersiz okuyucuya sol olduğunu.

İlgili konular