2012-12-28 7 views
15

Tôi muốn biết bạn nghĩ gì về điều này. Được khuyến khích sử dụng các yêu cầu đồng bộ (XMLHttpRequest) trong một nhân viên web? Tôi có thể tìm thấy vấn đề gì?Ý kiến ​​về các yêu cầu đồng bộ trong nhân viên web

Tôi đã thử nghiệm điều này trong ứng dụng của mình và tôi không tìm thấy bất kỳ sự cố nào. Nhưng tôi sợ hành vi đồng bộ này vì những trải nghiệm cũ với jQuery và AJAX. Ứng dụng của tôi nhận được một lượng lớn dữ liệu từ một vài bảng trong cơ sở dữ liệu và điều này đòi hỏi một thời gian. Đối với mỗi nhóm dữ liệu được lấy từ một bảng, tôi cần phải xử lý ngay lập tức nó để không trì hoãn toàn bộ quá nhiều. Trong khi đó, người dùng tương tác với trình duyệt, vì vậy nó có thể bị chặn và tôi nghĩ rằng các công nhân web sẽ hoạt động tốt. Bạn có nghĩ rằng đây là một giải pháp tốt không? Hoặc tôi nên thử với yêu cầu asynchronus?

Cảm ơn bạn.

+0

Có thể ... và tùy thuộc vào yêu cầu của bạn, mặc dù AJAX không phải là AJAX mà không có sự không đồng bộ !!! – geekman

+0

Tôi không thể khuyên bạn nên sử dụng SJAX (javascript và XML đồng bộ) nhưng tôi cũng muốn xem một số sự kiện khó khăn và mối quan tâm của tôi không phản ánh hành vi trong môi trường nhiều luồng. –

+0

Cảm ơn các bạn. Tôi biết ý nghĩa của A trong AJAX :) nhưng tôi đã thấy nhiều người làm một cái gì đó như thế này khi họ đang sử dụng công nhân web. – Gecko

Trả lời

15

tôi không có sự thật khó khăn, nhưng kể từ khi bạn hỏi ý kiến ​​... :)

Có một vấn đề kể trong Chrome: Quá nhiều Web Workers có thể gây ra một vụ tai nạn im lặng (mũ ~ 60-100 , theo số this bug report). Vấn đề chung là Web Worker là nguồn tài nguyên chuyên sâu, ít nhất là với v8.

Giả sử bạn đang đi để kết thúc làm cho nhiều cuộc gọi HTTP, nếu bạn đang làm cuộc gọi HTTP đồng bộ trong một Worker Web:

  • Trong một nghĩa nào đó, bạn đang kinh doanh các cuộc gọi HTTP không đồng bộ cho Web không đồng bộ Công nhân, mà sẽ chỉ được thêm một trung gian khác vào hỗn hợp và bạn vẫn phải quản lý mọi thứ một cách không đồng bộ.
  • Nếu bạn đi theo con đường đơn giản và hiệu quả hơn và chỉ sử dụng một Web Worker, bạn sẽ dành rất nhiều thời gian chờ đợi nó cung cấp cho bạn câu trả lời.
  • Nếu, mặt khác, bạn sử dụng nhiều Web Workers, bạn có thể cần phải theo dõi cái nào là miễn phí, cái nào đang bận, vv .. trong trường hợp này bạn sẽ tạo một bộ lập lịch biểu được trồng tại nhà thay vì sử dụng những gì được đưa vào trình duyệt.
  • Cuối cùng, các Web Worker đắt tiền (rõ ràng), và bạn có thể sẽ tạo ra nhiều Web Worker chỉ để họ có thể ngồi xung quanh và đợi cuộc gọi HTTP kết thúc.

Tôi không coi bản thân mình là chuyên gia về vấn đề này, vì vậy hãy thực hiện việc này vì những gì đáng giá.

Cập nhật: Thêm một số ưu điểm/khuyết điểm cho các trường hợp khác nhau.

Một số ưu/khuyết điểm mà tôi suy nghĩ khi lựa chọn giữa thực hiện cuộc gọi HTTP đồng bộ và không đồng bộ khi sử dụng một Worker Web:

  • Nói chung, yêu cầu đồng bộ sẽ dễ dàng hơn để viết và sẽ cho kết quả trong mã đó là dễ dàng để làm theo. Một nhược điểm của các yêu cầu đồng bộ là chúng có thể khuyến khích viết các hàm dài cần được khắc ra thành các hàm riêng biệt, nhỏ hơn.
  • Nếu bạn đang thực hiện một cuộc gọi, không có sự khác biệt về thời gian cần để hoàn thành giữa hai phương pháp và đồng bộ là tốt hơn vì nó đơn giản hơn một chút. Tôi nói nó chỉ đơn giản hơn một chút bởi vì một cuộc gọi asynch đơn với một người nghe gọi lại thực sự khá đơn giản.
  • Nếu bạn đang thực hiện nhiều cuộc gọi phải xảy ra trong một chuỗi cụ thể, như tải dữ liệu hồ sơ của người dùng và sau đó nhận thời tiết địa phương dựa trên địa chỉ của họ, cuộc gọi đồng bộ sẽ tốt hơn vì nó sẽ dễ dàng hơn để viết và dễ đọc hơn nhiều.Điều chính về đọc nó là các phụ thuộc tuần tự trong các cuộc gọi sẽ được vạch ra rõ ràng bởi sự lựa chọn thực hiện các cuộc gọi đồng bộ và thứ tự của chúng trong hàm. Càng có nhiều cuộc gọi, điều này càng quan trọng. Nếu có nhiều cuộc gọi, sự khác biệt về độ phức tạp có thể là quyết liệt.
  • Nếu bạn phải thực hiện nhiều cuộc gọi không cần phải xảy ra theo bất kỳ thứ tự cụ thể nào thì yêu cầu không đồng bộ sẽ tốt hơn vì quá trình tổng thể có thể là đơn đặt hàng có cường độ nhanh hơn so với yêu cầu đồng bộ. Càng nhiều cuộc gọi bạn đang thực hiện hoặc kết nối chậm hơn thì sự khác biệt đáng kể trong tổng thời gian trôi qua sẽ là; sự khác biệt này sẽ phát triển rất nhanh (theo cấp số nhân?). Theo quan điểm của ai đó đọc mã, tôi nghĩ sử dụng các yêu cầu đồng bộ, trong trường hợp này, sẽ là hơi gây hiểu nhầm vì nó cho thấy có tính chất tuần tự đối với các cuộc gọi mặc dù không có. Từ quan điểm của việc viết một loạt các yêu cầu asynch mà không phụ thuộc vào nhau, nó không nên quá xấu bởi vì bạn chỉ cần thiết lập một truy cập, thực hiện tất cả các cuộc gọi, tăng truy cập trong mỗi callbacks và bạn đã hoàn thành khi bộ đếm bằng số lượng cuộc gọi bạn đã thực hiện.
+0

Đẹp. Mặc dù bạn nói rằng bạn không phải là một chuyên gia về vấn đề này, ý kiến ​​của bạn là rất thú vị. – Gecko

+0

Có lẽ tôi đã không giải thích tất cả các chi tiết. Tôi muốn một nhân viên web duy nhất thực hiện tác vụ này trên nền. Tôi có nghĩa là, một công nhân web với một vòng lặp for để lấy dữ liệu từ mỗi bảng, làm một số phân tích và nhiều thứ hơn. Điều này làm việc tốt với các cuộc gọi đồng bộ, nhưng tôi nghĩ rằng tôi phải sử dụng một số chức năng gọi lại nếu tôi muốn sử dụng các cuộc gọi không đồng bộ (điều này có tốt hơn không?). Đây không phải là nhân viên web duy nhất trong ứng dụng của tôi, có ít nhất một người khác đang chạy cùng một lúc để thực hiện các tác vụ được lên lịch khác. Bạn có nghĩ rằng việc sử dụng công nhân web không được biện minh trong trường hợp này? Cảm ơn. – Gecko

+2

Thx để biết chi tiết. Web Worker là tuyệt vời và tôi không có nghĩa là để ngụ ý họ nên tránh. Nghe có vẻ rất tuyệt khi sử dụng một cái cho việc này. Câu hỏi với tôi là liệu nó có ý nghĩa khi sử dụng XHR không đồng bộ hay không. Nó sẽ ít lập trình asynch hơn vì bạn chỉ phải bắt đầu/dừng Web Worker thay vì bắt đầu và xử lý XHRs. Thực sự sôi xuống nếu đó là giá trị quá trình mất nhiều thời gian? Có khả năng lâu hơn nếu bạn có nhiều cuộc gọi HTTP để thực hiện. Tôi không thấy nhược điểm của việc sử dụng các yêu cầu HTTP asynch, trừ khi bạn chỉ cần một yêu cầu. – tiffon