我需要在Rx.NET中实现以下算法:
stream如果没有新商品,请从中获取最新商品,或等待新商品不加阻止.只有最新项目很重要,其他项目可以删除.SlowFunction并打印输出.天真的解决方案是:
let PrintLatestData (stream: IObservable<_>) =
stream.Select(SlowFunction).Subscribe(printfn "%A")
Run Code Online (Sandbox Code Playgroud)
但是,此解决方案不起作用,因为平均发布stream项目的速度快于SlowFunction消耗它们的速度.由于Select不会丢弃项目,而是尝试按从最旧到最新的顺序处理每个项目,因此在程序运行时,正在发出和打印的项目之间的延迟将增加到无穷大.只应从流中获取最新的最新项目,以避免这种无限增长的背压.
我搜索了文档,发现了一个onBackpressureLatest在RxJava中调用的方法,根据我的理解,我会按照上面的描述进行操作.但是,该方法在Rx.NET中不存在.如何在Rx.NET中实现这一点?
在涉及反应式编程时,我经常会遇到两个流相互依赖的情况.解决这些案件的惯用方法是什么?
一个最小的例子:有按钮A和B,都显示一个值.单击A必须将A的值增加B.单击B必须将B的值设置为A.
我可以提出第一个解决方案(例如在F#中,但欢迎任何语言的答案):
let solution1 buttonA buttonB =
let mutable lastA = 0
let mutable lastB = 1
let a = new Subject<_> ()
let b = new Subject<_> ()
(OnClick buttonA).Subscribe(fun _ -> lastA <- lastA + lastB; a.OnNext lastA)
(OnClick buttonB).Subscribe(fun _ -> lastB <- lastA; b.OnNext lastB)
a.Subscribe(SetText buttonA)
b.Subscribe(SetText buttonA)
a.OnNext 0
b.OnNext 1
Run Code Online (Sandbox Code Playgroud)
这个解决方案使用可变状态和主题,它不是非常易读,也不像惯用语.
我尝试的第二个解决方案涉及创建一个将两个相关流链接在一起的方法:
let dependency (aGivenB: IObservable<_> -> IObservable<_>) (bGivenA: IObservable<_> -> IObservable<_>) =
let bProxy = new ReplaySubject<_> ()
let a = …Run Code Online (Sandbox Code Playgroud) 我试图使用MinGW在Fedora 26上为64位Windows 交叉编译OpenImageIO.在yum用于检索依赖项的mingw版本之后,我运行了mingw64-cmake后跟make.但是,我收到一个关于stdlib.h找不到的编译错误.
[ 0%] Built target CopyFiles
[ 0%] Building CXX object src/libutil/CMakeFiles/OpenImageIO_Util.dir/argparse.cpp.obj
In file included from .../oiio/src/libutil/argparse.cpp:36:0:
/usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
#include_next <stdlib.h>
^~~~~~~~~~
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
我已经确认stdlib.h至少在提供编译器错误的文件所在的位置/usr/include/和/usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/位置找到了该位置.
为什么我仍然收到错误stdlib.h: No such file or directory?
更新:
我做了更多研究并学习了以下内容:The preprocessor directive #include_next behaves like the #include directive, except that it specifically excludes the directory of the including file …
当我开始我的项目时,我忘记将某些文件添加到我的 .gitignore 中,因此提交了我不应该添加的文件。之后我忽略了这些文件,如here所述。损坏已经发生,因为文件仍然存在于我的存储库的历史记录中,现在我的存储库大小为 10GB!
由于上述原因,我没有推送文件,因此重写历史记录应该没问题。简而言之,我需要做的是重写历史记录,以便之后当前文件中没有任何文件.gitignore存储库中的任何提交中存在。
编辑:有很多小文件导致大文件,所以关于如何删除超过特定大小阈值的所有文件的建议重复并不能解决这个问题。