小编dev*_*rts的帖子

同步和scala期货的死锁

我似乎无法弄清楚为什么以下代码死锁:

"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)

asynchronous scala

4
推荐指数
1
解决办法
901
查看次数

Lucene.net用于大型索引的内存不足

我有一个包含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或更小的索引,所以也许这是不可能的,但我想至少问一下.

如果有人对我能做什么做任何建议,使这个可用,这将是伟大的.如果可能的话,我愿意牺牲搜索速度来使用内存.

c# memory performance lucene.net

3
推荐指数
1
解决办法
1822
查看次数

如何执行模块做阻塞?

我需要在一个模块中进行一些设置,我希望通过利用一个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)

f#

3
推荐指数
1
解决办法
1287
查看次数

创建只有一些消息得到响应的代理?

是否可以创建仅在有时发布回复的邮箱代理?从它的外观来看,在我看来,如果你想发布回复,你必须总是发送一个异步回复频道.

对于我的用例,我真的希望能够灵活地将一些消息只需要传递给代理,而其他消息我想要获得同步或异步回复.

f# mailboxprocessor

3
推荐指数
1
解决办法
411
查看次数