Câu hỏi Trang bị thêm với Rxjava Schedulers.newThread () vs Schedulers.io ()


Những lợi ích để sử dụng là gì Schedulers.newThread() so với Schedulers.io() trong Retrofit yêu cầu mạng. Tôi đã thấy nhiều ví dụ sử dụng io()nhưng tôi muốn hiểu tại sao.

Tình huống ví dụ:

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())...

so với

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())...

Một trong những lý do tôi đã thấy là -

newThread() tạo một chuỗi mới cho mỗi đơn vị công việc. io() sẽ sử dụng một hồ bơi thread

Nhưng ảnh hưởng của lập luận đó lên ứng dụng là gì? Và những khía cạnh khác có gì?


76
2017-10-29 13:41


gốc




Các câu trả lời:


Bạn đúng là lợi ích của việc sử dụng Schedulers.io() nằm trong thực tế là nó sử dụng một hồ bơi thread, trong khi Schedulers.newThread() không làm.

Lý do chính mà bạn nên xem xét khi sử dụng các nhóm luồng là chúng duy trì một số luồng được tạo trước không hoạt động và chờ công việc. Điều này có nghĩa là khi bạn đã hoàn thành công việc, bạn không cần phải trải qua quá trình tạo luồng. Một khi công việc của bạn được thực hiện, chủ đề đó cũng có thể được tái sử dụng cho công việc trong tương lai thay vì liên tục tạo và hủy các luồng.

Chủ đề có thể tốn kém để tạo ra, do đó, giảm thiểu số lượng các chủ đề mà bạn đang tạo ra trên bay nói chung là tốt.

Để biết thêm thông tin về hồ bơi luồng, tôi khuyên bạn nên:


89
2017-10-29 13:57



Có thể có giá trị thêm một bình luận về Scheduler.io () được dựa trên một hồ bơi thread unbounded mà có thể không thích hợp cho một số trường hợp sử dụng. Xem stackoverflow.com/questions/31276164/… - Dave Moten
@DaveMoten Những trường hợp sử dụng nào không phù hợp cho nhóm luồng thông qua Schedulers.io? - Igor Ganapolsky
Nếu bạn có nhiều công việc đồng thời để làm với Schedulers.io() sau đó bạn có thể gặp giới hạn OS i / o (ví dụ: số lượng tệp mở tối đa, số lượng tối đa các kết nối tcp cho mục đích độ tin cậy có thể vẫn mở trong một khoảng thời gian ngay sau khi được xử lý). Mỗi chủ đề mới cũng yêu cầu số lượng RAM tối thiểu không nhỏ (> 512K nhưng hoạt động trên 1M) để bạn có thể hết RAM. - Dave Moten
Những chủ đề đó có cùng bộ nhớ không? ví dụ. đối tượng được tạo trong một chuỗi io và được truy cập trong một chuỗi io khác. - Eido95
@ Eido95 họ chia sẻ cùng một đống, không phải là cùng một ngăn xếp. Theo như các biến đi, có bạn có thể chia sẻ các biến giữa các chủ đề (với tất cả các cảnh báo điển hình về việc đảm bảo các biến đó là an toàn luồng). - Tanis.7x