使用RxJava限制吞吐量

时间:2016-04-03 08:41:05

标签: android multithreading functional-programming rx-java observable

我现在的情况很难解释,所以我会写一个更简单的版本来解释这个问题。

我有Observable.from(),它会发出由ArrayList个文件定义的文件序列。所有这些文件都应该上传到服务器。为此,我有一个功能来完成工作并返回Observable

Observable<Response> uploadFile(File file);

当我运行此代码时,它会变得疯狂,Observable.from()会发出所有文件并将它们全部上传到文件中,或者至少可以处理它可以处理的最多线程。

我希望最多同时上传2个文件。是否有任何操作员可以为我处理这个问题?

我尝试了缓冲区窗口和其他一些,但它们似乎只会一起发出两个项目,而不是经常上传两个并行文件。我还尝试在上传部分设置最大线程池,但在我的情况下不能使用它。

这个权利应该有一个简单的运算符吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

我认为所有文件都是并行上传的,因为您正在使用Sub Button27_Click() Dim wbThis As Workbook, wbThat As Workbook Dim ws As Worksheet Dim fName As String On Error GoTo Whoa Set wbThis = ThisWorkbook Set ws = wbThis.Sheets("Sheet3") fName = wbThis.Path & "\sefaresh.xlsm" Application.ScreenUpdating = False Set wbThat = Workbooks.Open(fName) DoEvents ws.Copy After:=wbThat.Sheets(wbThat.Sheets.Count) '~~> close and save the workbook wbThat.Close (True) DoEvents '<~~ Give time for it to save and close LetsContinue: Application.ScreenUpdating = True MsgBox "Done" Exit Sub Whoa: MsgBox Err.Description Resume LetsContinue End Sub ,它会同时执行所有转换。相反,你应该使用flatMap(),它运行一个接一个的转换。要运行两个并行上传,您需要在可观察文件上调用concatMap(),然后像在代码中一样调用window(2)

flatMap()

<强>更新

我找到了一个更好的解决方案,它可以完全满足您的需求。 Observable<Response> responses = files .window(2) .concatMap(windowFiles -> windowFiles.flatMap(file -> uploadFile(file)); ); 的重载接受最大并发线程数。

flatMap()