2010-11-10 37 views
11

Trong khi đi qua mã trong dự án của chúng tôi Tôi đã xem qua một phương pháp web mà có mã này ở phần cuối của nó:tại sao không sử dụng Thread.Sleep không có lý do, và giải thích cho một lập trình viên

thread.sleep(6000); 
return true; 

Bây giờ, điều này đã được thực hiện để cuộc gọi ajax jQuery từ máy khách bị trì hoãn và hoạt ảnh ajax sẽ hiển thị lâu hơn một chút.

Điều này rất sai trong mắt tôi. Không nên có loại kết nối này giữa giao diện người dùng và phía máy chủ. Nếu anh ta muốn hoạt ảnh mất nhiều thời gian hơn, anh ta có thể sử dụng chức năng setTimeOut ở phía máy khách.

Đây là vấn đề của tôi: làm thế nào tôi có thể giải thích cho lập trình viên tại sao điều này lại sai? Không chỉ vì điều khách hàng/máy chủ, nhưng tại sao lại gọi thread.sleep trên một trang web?

+0

Cá nhân, tôi nghĩ bạn nên đặt câu hỏi này trên [PR] (http://programmers.stackexchange.com). – Bobby

+0

ý của bạn là gì? –

+9

Anh ấy phải khá tự hào về hoạt ảnh đó để ** buộc ** mọi người xem trong 6 giây thay vì thực hiện bất kỳ trang web nào được sử dụng. – Brad

Trả lời

16

Trong khi trì hoãn:

  • Bạn đang sử dụng/chặn một sợi
  • Bạn đang tiêu thụ bộ nhớ
  • Bạn có một kết nối mở TCP/IP

đây là tất cả các nguồn lực tốn kém trên máy chủ

Vì:

  • Nếu có yêu cầu khác, tỷ lệ cược lớn hơn phải tạo luồng mới, vì vậy điều này sẽ sử dụng CPU, bộ nhớ vv và điều này sẽ trì hoãn yêu cầu này. (Bắt đầu câu).
  • Mức tiêu thụ bộ nhớ nhiều hơn, có nghĩa là nhiều lỗi trang hơn, hàng đợi đĩa lớn hơn. Tất cả yêu cầu mất nhiều thời gian hơn.
  • Kết nối TCP/IP là tài nguyên giới hạn.
2

Vì phương thức web có thể có nhiều người tiêu dùng, không phải tất cả đều muốn dữ liệu của họ bị trì hoãn.

Cập nhật

Ok, cũng còn có một số hữu hạn các đề người lao động trong hồ bơi mà sẽ xử lý yêu cầu của khách hàng. Bạn không muốn buộc họ không làm gì cả. Đó là một chức năng của giao diện người dùng để trì hoãn hiển thị dữ liệu, không phải là phương pháp dịch vụ web/trang cung cấp dữ liệu. Bạn sẽ không đặt một giấc ngủ trong lớp truy cập dữ liệu của bạn, tại sao bạn sẽ đặt nó trong một WebMethod?

+0

đẹp .. nhưng không đủ tốt .. đồng đội này của tôi muốn tranh luận .. tôi sẽ cần một lời giải thích tốt hơn ... –

7

Điều này sẽ kết thúc bằng cách truy cập vào nhiều chuỗi bị chặn trên máy chủ.
Cho phép nói rằng bạn có 100 yêu cầu/giây bạn có 600 luồng ngủ.
Các chủ đề đó sẽ sử dụng RAM 1MB trong không gian ngăn xếp, sau đó bạn sẽ lãng phí 600MB RAM máy chủ.

4

ROFL - trì hoãn hoạt hình được thực hiện trên một phía máy chủ: D

Đưa một sự chậm trễ với một cái cớ "một khách hàng cần rằng sự chậm trễ" làm phương pháp client-aware. Và đó là một mùi. Trong một nghĩa nào đó nó cũng vi phạm SRP - bởi vì bây giờ phương pháp làm hai việc (làm điều gì đó hữu ích và làm chậm trễ) và nếu bạn muốn giữ giấc ngủ, bạn phải chỉ ra nó như vậy trong tên, chẳng hạn như: DoSomethingUsefulAndDelayToo().

Nhưng đối với tôi, "phương pháp sẽ là người bất khả tri gọi" nên là điểm chính. Lý do "chúng tôi cần một sự chậm trễ" vi phạm nguyên tắc phân tách mối quan tâm - vì bây giờ phương pháp của bạn không chỉ giúp bạn có được dữ liệu, mà còn bị ô nhiễm bởi một logic trình bày (hoạt hình).

Bên cạnh đó, bạn có thể giới thiệu độ trễ vào hàng đợi hoạt ảnh có thể (và nên) dễ dàng được thực hiện bằng cách sử dụng jQuery.

Nguyên tắc có lý do, đó là kinh nghiệm vi phạm nguyên tắc tác động không phải lúc nào cũng rõ ràng trong mọi trường hợp, nhưng trong hầu hết các trường hợp, nó sẽ quay lại và săn bạn.

Nếu anh ta nhấn mạnh, ít nhất là phá vỡ phương pháp thành hai - một phương pháp sẽ chỉ làm "ngủ (6000); trả lại;" bây giờ điều đó sẽ vô lý.

2

làm cách nào tôi có thể giải thích cho người lập trình tại sao điều này sai?

Đơn giản. Việc sử dụng Sleep() là một số code smell. Giai đoạn.

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