2011-12-29 22 views
17

Tôi đang nghĩ đến việc sử dụng Công nhân Web để cung cấp một số chức năng cơ bản trong khi người dùng đang duyệt trang web của tôi (đó là những gì Công nhân Web đang làm, đúng không?). Tuy nhiên, tôi không muốn mạo hiểm trải nghiệm người dùng bằng cách gây ra tình trạng cuộn lộn xộn, điều khiển không phản hồi, vv Công nhân Web được ánh xạ trên các luồng hệ điều hành, vì vậy tôi mong đợi một số quyền kiểm soát ưu tiên của các luồng này, như tôi biết, không có điều gì trong API hiện tại. Bạn có biết cách thực hiện điều này không? Ngay cả với một hack?Có cách nào để đặt một Web Worker thành ưu tiên thấp không?

+2

Trên nền tảng và ngôn ngữ nào? – rene

+0

Bạn có ý định sử dụng công việc web nào? Hoạt động định kỳ? Một lần thực hiện một nhiệm vụ? – Tudor

+0

@Tudor Tôi sẽ nói thực hiện một lần (ví dụ: người dùng tải lên ảnh và nhân viên áp dụng bộ lọc giống như Photoshop, đó là CPU khá chuyên sâu, sau đó nhân viên cảnh báo chủ đề chính). – tunnuz

Trả lời

11

Vâng, không có cuộc gọi API nào để kiểm soát các chi tiết cấp thấp như thế này. Tuy nhiên, tôi nghĩ trước tiên bạn nên triển khai những gì bạn muốn làm và sau đó kiểm tra xem hiệu suất truy cập có quá lớn trên trải nghiệm người dùng hay không. Tôi giả định rằng kể từ khi họ không thêm kiểm soát tốt về cách các chủ đề thực hiện, họ có lẽ cũng được quản lý bởi việc thực hiện cơ bản.

9

Ngay cả khi bị hack? [...] người dùng tải lên một bức ảnh và người lao động áp dụng một giống như Photoshop lọc với nó, mà là khá CPU chuyên sâu, sau đó người lao động cảnh báo thread chính

Dưới đây là một hack.

Làm chậm mã của bạn. Một cái gì đó như thế này là những gì tôi hiện đang sử dụng cho một mô phỏng hạt:

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 là thời gian giữa tính toán và sẽ cần phải thể khác nhau tùy theo những gì bạn đang làm và bao lâu bạn có thể đủ khả năng để tăng đó là thời gian. Một điều tốt về việc làm theo cách này là bạn có thể chấp nhận tạm dừng và hủy yêu cầu giữa các lần lặp lại.

Các vấn đề liên quan