小编Mic*_*ael的帖子

使用子命令创建自动完成脚本

我正在尝试创建一个与鱼一起使用的自动完成脚本; 我正在为同一个程序移植一个bash完成脚本.

该方案有三个顶级的命令,比如foo,barbaz每个有一些子命令,只说a bc每个.

我所看到的是,顶层命令自动完成好了,所以如果我型f我得到foo自动完成,但随后如果我再次按Tab键,看看它的子命令是的,我看到foo,bar,baz,a,b,c和它应该只是a,b,c

我使用git完成脚本作为参考,因为它似乎正常工作.我也使用git flow脚本作为参考.

认为这是在git完成脚本中通过以下方式处理的:

function __fish_git_needs_command
  set cmd (commandline -opc)
  if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ]
    return 0
  end
  return 1
end
Run Code Online (Sandbox Code Playgroud)

这是有道理的,你只能使用完成,如果命令有一个arg,脚本本身; 如果你使用它作为条件(-n)来完成顶级命令的调用,我认为正确的事情会发生.

但是,我所看到的并非如此.我将该函数复制到我的脚本中,适当地更改了"git",并且没有任何运气.

修剪下来的脚本如下:

function __fish_prog_using_command
  set cmd (commandline -opc) …
Run Code Online (Sandbox Code Playgroud)

fish

10
推荐指数
1
解决办法
4495
查看次数

使用 netty 非阻塞写入大对象

这里参考我之前的问题,我试图找出将大对象从服务器流式传输到客户端的正确方法。

服务器正在执行 a ,write然后是 a flush,并且其中有一个处理程序Channel,它将获取大对象并迭代地将其分解为小块,writeAndFlush对每个块执行 a 。我希望这会将大对象变成客户端可以根据需要使用和重建的可管理消息流。

我看到的是,这些都位于出站缓冲区中,直到它们全部写入并可以发送,或者我 OOM 服务器。我希望它们在编写时被刷新/发送以避免这个问题。(如果我不 OOM 服务器,它确实像设计的那样以流的形式进入客户端,即在写入所有数据之前,任何数据的传输都会被阻止)。

如果我尝试通过将其分派Callable到与Executor关联的对象ChannelHandlerContext然后将原始对象标记ChannelPromise为成功来执行分解操作,我仍然会看到相同的行为。

如果我改为使用 non-netty Executor,我似乎得到了正确的行为,我可以立即看到数据登陆客户端,但这感觉像是错误的解决方案。

将大对象分解为较小的可写对象时,我确实看到在我写入第一个对象后,通道可写性立即变为 false。正如@norman-maurer 所指出的,我意识到此时我应该停止写作。但不清楚如何获得我可以安全恢复写作的事件。在这种情况下您将如何处理写入也不清楚,但也许那是因为我不知道您如何获得事件。

netty

5
推荐指数
1
解决办法
1584
查看次数

可以优化阵列访问吗?

也许我被我的探测器(Netbeans)误导了,但我看到了一些奇怪的行为,希望也许有人可以帮助我理解它.

我正在开发一个应用程序,它大量使用相当大的哈希表(键是long,值是对象).内置java哈希表(特别是HashMap)的性能非常差,在尝试了一些替代方案 - Trove,Fastutils,Colt,Carrot之后 - 我开始独立工作了.

使用双哈希策略的代码非常基础.这工作得很好,并且显示了迄今为止我尝试过的所有其他选项的最佳性能.

根据分析器的说法,查找哈希表是整个应用程序中最昂贵的方法 - 尽管事实上其他方法被调用了很多次,和/或做更多的逻辑.

让我感到困惑的是查找仅由一个类调用; 调用方法执行查找并处理结果.两者的调用次数几乎相同,调用查找的方法在处理查找结果时有很多逻辑,但速度提高了约100倍.

下面是哈希查找的代码.它基本上只是对数组的两次访问(根据分析,计算哈希码的函数几乎是免费的).我不明白这段代码怎么会这么慢,因为它只是数组访问,我没有看到任何使它更快的方法.

请注意,代码只返回与密钥匹配的存储桶,调用者应该处理存储桶.'size'是hash.length/2,hash1在哈希表的前半部分进行查找,hash2在后半部分进行查找.key_index是传递给构造函数的哈希表上的最终int字段,Entry对象上的values数组是一个长度通常为10或更小的long数组.

人们对此有任何想法都非常感激.

谢谢.

public final Entry get(final long theKey) {
    Entry aEntry = hash[hash1(theKey, size)];

    if (aEntry != null && aEntry.values[key_index] != theKey) {
        aEntry = hash[hash2(theKey, size)];

        if (aEntry != null && aEntry.values[key_index] != theKey) {
            return null;
        }
    }

    return aEntry;
}
Run Code Online (Sandbox Code Playgroud)

编辑,hash1和hash2的代码

private static int hash1(final long key, final int hashTableSize) { 
    return (int)(key&(hashTableSize-1)); 
}
private static int hash2(final long …
Run Code Online (Sandbox Code Playgroud)

java arrays optimization micro-optimization

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

如何使用netty通过HTTP流式传输响应

我正在使用Netty 3.6.6,我想向调用者发送一个大的响应.我无法将响应主体复制到ChannelBuffer中,因为在某些情况下它会非常大.

我正在将服务器从CXF迁移到Netty,以前,我可以使用CXF提供的OutputStream来写入数据.

我最初试图在没有内容的情况下发送响应,然后继续在一系列8k缓冲区中将数据写入Channel.这失败了,因为客户端似乎得到了原始响应并且看不到任何数据和抱怨.我尝试将响应设置为chunked,但这似乎没有什么区别,也没有设置chunked头,客户端总是看到一个空流.

我看到3.6.6的文件服务器示例,这与我想要做的类似,除了数据不是文件.我看到了ChunkedStream和NioStream,它似乎接近我需要的东西,除了它们采用InputStream/ReadableByteChannel而我有一个OutputStream; 我可以尝试使用PipedInput和OutputStreams,但这似乎会引入一个不幸的瓶颈.

我确信有一种方法可以将大量数据流回客户端以响应请求,但我只是没有看到如何操作它,除非我有一个文件.

我也很好奇如果连接保持活动状态,你是如何让客户知道响应是完整的,并且你是流内容,但不知道内容长度.似乎客户端会在这些情况下永远等待连接关闭.

修改3.6.6中的静态文件服务器示例以删除内容长度标头(只是将其注释掉),指定它是一个分块响应

   response.setChunked(true);
   response.setHeader(Names.TRANSFER_ENCODING, Values.CHUNKED);
Run Code Online (Sandbox Code Playgroud)

然后ChunkedNioStream在写回复后用来发送文件:

    // Write the initial line and the header.
    ch.write(response);

    final ReadableByteChannel aIn = java.nio.channels.Channels.newChannel(new FileInputStream(file));
    ChannelFuture writeFuture = ch.write(new ChunkedNioStream(aIn));
Run Code Online (Sandbox Code Playgroud)

产生不良行为,客户端获得几百个字节,然后停止接收,基本上是我在我的应用程序中看到的.正确的事情似乎只发生在内容长度上,这在我的用例中是不可行的.

netty

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

为什么通过LocalChannel连接的客户端需要EventLoopGroup?

这实际上可能与客户一般使用有关Bootstrap- 显然该组是任何客户所必需的.

但是如果你在一个JVM上运行多个客户端,那么你真的会占用大量内存EventLoopGroup为每个客户端创建一个并且可以很容易地自己完成OOM.

我能够通过EventLoopGroup在JVM中的所有客户端之间共享一个全局来解决这个问题,并使用引用计数来确保它干净利落地被破坏,但这似乎更像是一种解决方法,而不是预期的设计.

并且似乎没有任何EventLoopGroup实现只使用单线程执行程序,这将执行串行执行客户端的调用; 我意识到这与Netty的异步性质有些不一致,但它是一个合法的用例.

netty

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

标签 统计

netty ×3

arrays ×1

fish ×1

java ×1

micro-optimization ×1

optimization ×1