2011-12-29 129 views
17

我正在考慮在用戶瀏覽我的網站時使用Web Workers來提供一些後臺功能(這是Web Workers的用途,對吧?)。但是,我不想冒着通過導致滯後滾動,無響應的控制等來損害用戶體驗的風險.Web Worker被映射到操作系統線程,因此,我期望對這些線程的優先級進行一些控制,但是到目前爲止據我所知,目前的API中沒有這樣的東西。你知道如何做到這一點?即使有黑客?有沒有辦法將Web Worker設置爲低優先級?

+2

什麼平臺和語言? – rene 2012-01-01 17:41:03

+0

你打算使用網絡工作者進行什麼樣的任務?定期活動?一次性執行任務? – Tudor 2012-01-01 18:31:20

+0

@Tudor我會說一次性執行(例如,用戶上傳一張照片,工作人員使用類似Photoshop的過濾器,這非常耗費CPU時間,然後工作人員會提醒主線程)。 – tunnuz 2012-01-02 07:46:06

回答

11

那麼,沒有API調用來控制像這樣的低級細節。不過,我認爲你應該首先實現你想要做的事情,然後測試一下用戶體驗中的性能影響是否太大。我假設由於他們沒有對線程的執行方式進行良好控制,他們可能很好地被底層實現管理。

9

即使有黑客? [...] 用戶上傳的照片和工作人員將一個Photoshop樣 過濾器給它,這是非常CPU密集型,那麼工人提醒 主線程

這裏是一個黑客。

減慢你的代碼。像這樣的東西是什麼,我現在使用的粒子模擬:

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是計算之間的時間,將需要不同取決於你在做什麼,多長時間你能負擔得起,以增加它的時間。這樣做的一個好處是你可以在迭代之間接受暫停和取消請求。

相關問題