我似乎无法弄清楚为什么以下代码死锁:
"Locks around blocking futures" should "be re-entrant" in {
val lock = new Object()
def processInFuture = {
lock.synchronized {
// simulate async call made blocking
Await.result(Future {
blocking {
logger.info("Sleeping")
Thread.sleep(100)
logger.info("Waking")
}
}, Duration.Inf)
}
}
// fire off 10 async events and wait on each one
(0 until 10).
map(_ => Future { processInFuture }).
foreach(future => Await.result(future, Duration.Inf))
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在关键部分中使异步同步会导致整个fork-join池出现问题.
如果我使未来在fork连接池的单独池上执行,那么它可以工作.我不明白为什么fork join pool线程不阻塞其他线程然后先完成?是因为游泳池被某种方式阻挡了吗?
我意识到如果它的异步,它总是最好使所有异步,但有些情况不允许(例如带有番石榴缓存的缓存)
- 编辑
为了说明@Dima的答案,这是有效的
"Locks around blocking futures" should "be re-entrant" in …Run Code Online (Sandbox Code Playgroud) 我有一个包含10个字段的Lucene.net索引,其中一些是存储的,一些是索引的,有4.6亿个文档.该指数约为250GB.我正在使用Lucene.net 3.0.3并且每次进行搜索时我都会在RAM中轻松吃掉2GB +,这会导致我的32位应用程序出现内存异常.遗憾的是,由于其他32位依赖项,我无法将应用程序作为64位进程运行.
据我所知,我正在遵循Lucene的最佳实践:
一个打开索引的编写器,分批编写文档
共享阅读器,不会关闭并在搜索中重新打开
索引搜索者的termInfosIndexDivisor设置为4,这似乎没有什么区别.我甚至尝试将它设置为像1000这样巨大的东西但没有注意到任何内存变化.
不分析不需要进行子搜索的字段(即仅完整字符串搜索),并且不存储不需要从搜索中检索回的字段.
我正在使用StandardAnalyzer索引和搜索的默认值.
如果我修剪数据并制作一个较小的索引,那么事情就可以了.当我的索引大小约为50GB时,我可以用大约600MB的RAM搜索它
但是,我确实在其中一个字段上应用了排序,但即使没有排序,内存使用对于任何搜索都是巨大的.我并不特别关心文档分数,更多的是文档存在于我的索引中,但我不确定是否忽略分数计算将有助于内存使用.
我最近从Lucene.net 2.9.4升级到Lucene.net 3.0.3,认为这可能有所帮助,但两个版本之间的内存使用情况大致相同.
坦率地说,我不确定这个索引对于一台机器来说是否太大而无法进行搜索.我发现的大多数例子都是关于20-30GB或更小的索引,所以也许这是不可能的,但我想至少问一下.
如果有人对我能做什么做任何建议,使这个可用,这将是伟大的.如果可能的话,我愿意牺牲搜索速度来使用内存.
我需要在一个模块中进行一些设置,我希望通过利用一个do块来完成.奇怪的是,我的do街区似乎永远不会受到打击.
更奇怪的是,如果我将模块代码加载到fsi中,它确实会受到攻击.这是我的例子:
Main.fs
[<EntryPoint>]
let main args =
printfn "%b" TestNamespace.M.x
0
Run Code Online (Sandbox Code Playgroud)
TestModule.fs
namespace TestNamespace
module M =
do
printfn "In do"
failwith "Error" // this is line 6
let x = true
Run Code Online (Sandbox Code Playgroud)
当我运行编译的可执行文件时,我得到
>test.exe
true
Run Code Online (Sandbox Code Playgroud)
为什么不抛出异常?如果我自己在FSI中运行模块,我会得到
In do
System.Exception: Error
at <StartupCode$FSI_0006>.$FSI_0006.main@() in C:\Projects\Personal2\Playground\fsscripts\fsscripts\TestModule.fs:line 6
Stopped due to error
Run Code Online (Sandbox Code Playgroud)
所以它得到了例外.
我在转换中看到do初始化程序被转换为单独的类
namespace \u003CStartupCode\u0024fsscripts\u003E
{
internal static class \u0024Library1
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[CompilerGenerated]
[DebuggerNonUserCode]
internal static int init\u0040;
static \u0024Library1()
{
ExtraTopLevelOperators.PrintFormatLine<Unit>((PrintfFormat<Unit, TextWriter, Unit, Unit>) new PrintfFormat<Unit, …Run Code Online (Sandbox Code Playgroud) 是否可以创建仅在有时发布回复的邮箱代理?从它的外观来看,在我看来,如果你想发布回复,你必须总是发送一个异步回复频道.
对于我的用例,我真的希望能够灵活地将一些消息只需要传递给代理,而其他消息我想要获得同步或异步回复.