2011-12-29 20 views
17

Bir kullanıcı web siteme göz atarken bazı arka plan işlevleri sağlamak için Web Çalışanlar'ı kullanmayı düşünüyorum (Web Çalışanlar bunun için uygun, değil mi?). Bununla birlikte, kullanıcı deneyiminden taviz vermek, laggy kaydırma, tepkisiz kontroller vb. Nedenlerle riske girmek istemiyorum. Web İşçileri, OS iş parçacıkları üzerinde eşleştiriliyor, dolayısıyla, bu iş parçacıklarının önceliği üzerinde bazı kontroller beklemekteyim. Bildiğim kadarıyla mevcut API'da böyle bir şey yok. Bunu nasıl başaracağınızı biliyor musunuz? Bir hack ile bile mi?Bir Web Çalışanı'nı düşük öncelikli olarak ayarlamanın bir yolu var mı?

+2

Hangi platformda ve hangi dilde? – rene

+0

Web çalışanlarını ne amaçla kullanıyorsunuz? Periyodik aktivite? Bir kez bir görev yürütme? – Tudor

+0

@Tudor Tek seferlik bir yürütme (örneğin, kullanıcı bir fotoğraf yükler ve işçiye Photoshop benzeri bir filtre uygular, bu da oldukça yoğun CPU yoğun, daha sonra çalışan ana iş parçacığı uyarır) derdim. JS'de – tunnuz

cevap

11

Böyle düşük düzeydeki ayrıntıları denetlemek için API çağrısı yok. Bununla birlikte, ilk önce yapmak istediğinizi uygulamanız gerektiğini ve performans isabetinin kullanıcı deneyiminde çok büyük olup olmadığını test etmeniz gerektiğini düşünüyorum. Konuların nasıl işlediğine dair ince kontrol eklemedikleri için, muhtemelen temel uygulama tarafından iyi yönetiliyorlar.

9

Bir kesmekle bile mi? [...] kullanıcı bir fotoğraf yükler ve işçi oldukça yoğun işlemci buna bir Photoshop benzeri filtresi, uygular, daha sonra işçi İşte kesmek ana iş parçacığı

uyarır.

Kodunuzu yavaşlayın.

var TIME_STEP = 10, 
    paused = false, 
    state; // set by commands.start() 

function main_loop() { 
    if (paused) { 
     return; 
    } 

    // update state incrementally. Break your process into chunks 
    // for example pixels or rows of pixels 
    state = ____________; 

    // send state or progress to main thread 
    if (finished) { 
     self.postMessage(state); 
    } else { 
     self.postMessage(progress); 
    } 

    setTimeout(main_loop, TIME_STEP); 
} 

var commands = { 
    //...functions that can be called from main thread (pause/start/cancel/etc)... 
}; 

function message_handler (event) { 
    var data = event.data; 
    var command = commands[data.command]; 

    command.apply(this, data.args); 
} 

self.addEventListener('message', message_handler, false); 

TIME_STEP hesaplamalar arasındaki zaman ve ne yaptığınızı bağlı ve ne kadar zamanı geldi artırmak için göze farklı olması gerekir: Böyle bir şey Şu anda bir parçacık simülasyonu için kullanıyorum budur. Bu şekilde yapmanın iyi bir yanı, yinelemeleri arasındaki istekleri duraklatabilir ve iptal edebilirsiniz.

İlgili konular