我刚开始玩Grinder(喜欢它!)但是遇到了一些奇怪的行为,如下所示:
我一直在使用5个工作人员来解析推文文本并将它们发送到我负载测试的URL。 Grinder正在顺利地工作,但我注意到Python urlencode在一些unicode或latin编码的东西上失败了(例如,一些线程因为不合时宜的死亡而死亡)。
我想,既然Jython真的是Java,我会尝试在可疑字符串上使用java.net.URLEncoder,看看它是如何表现的。
所以在我的Jython脚本的顶部我添加了
from java.net import URLEncoder
并将python urlencode包装在try / catch中,后者依赖于UrlEncoder.encode(myString,'UTF-8')
当我使用一名工人进行测试时,它似乎完美无缺。但是,一旦我将工作人员数量增加到2或3以上,工人就会启动,但随后无法与控制台通信,在不合理的长时间加载后抛出以下错误:
2012-11-15 15:59:04,287 ERROR worker-bootstrap: Error running worker process
net.grinder.communication.CommunicationException: Exception whilst sending message
at net.grinder.communication.AbstractSender.send(AbstractSender.java:57) ~[grinder-core-3.11.jar:na]
at net.grinder.communication.QueuedSenderDecorator.flush(QueuedSenderDecorator.java:60) ~[grinder-core-3.11.jar:na]
at net.grinder.engine.process.GrinderProcess.sendStatusMessage(GrinderProcess.java:638) ~[grinder-core-3.11.jar:na]
at net.grinder.engine.process.GrinderProcess.run(GrinderProcess.java:430) ~[grinder-core-3.11.jar:na]
at net.grinder.engine.process.WorkerProcessEntryPoint.run(WorkerProcessEntryPoint.java:86) [grinder-core-3.11.jar:na]
at net.grinder.engine.process.WorkerProcessEntryPoint.main(WorkerProcessEntryPoint.java:59) [grinder-core-3.11.jar:na]
Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.6.0_37]
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) ~[na:1.6.0_37]
at java.net.SocketOutputStream.write(SocketOutputStream.java:136) ~[na:1.6.0_37]
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) ~[na:1.6.0_37]
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) ~[na:1.6.0_37]
at java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1793) ~[na:1.6.0_37]
at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:699) ~[na:1.6.0_37]
at net.grinder.communication.AbstractSender.writeMessageToStream(AbstractSender.java:90) ~[grinder-core-3.11.jar:na]
at net.grinder.communication.StreamSender.writeMessage(StreamSender.java:70) ~[grinder-core-3.11.jar:na]
at net.grinder.communication.AbstractSender.send(AbstractSender.java:53) ~[grinder-core-3.11.jar:na]
... 5 common frames omitted
这看起来基本上就像我的超时(断管,暗示我猜控制台厌倦了听力或者代理人厌倦了尝试连接)。但我不确定为什么。 (我也不确定在异常中看到“while”这个词我感觉如何.Drawth,Hacker!你没看到过吗? 险恶的内存泄漏? )
就手头的代码问题而言,我可以做得比Python urlencode的(当前实现的)默认行为更好 - 我知道一些改进的技巧但是它们往往会变得混乱而且我有点像猜测他们中的一些人不会在Jython中工作。
但我对这里的一般水平感到好奇。 Java URLEncode工作得很好 - 不论是3名工人还是更少 - 所以为什么在有更多工人的情况下它会失败?
猜测:
我的系统资源不足吗?
恐怖 - 每个工作者都在创建自己的 JVM吗?
嗯,检查,是的,事实证明。但这并没有停止 以前的事情。为什么现在?我的mac中有2个处理器 - 我愿意 如果这是问题,我们应该对3名工人失败,但是,不,不。 4或5, 是的。
在Jython中使用本机Java库,出于某种原因,不是一个好主意吗?
见解赞赏。
由于 JB
答案 0 :(得分:0)
我不确定这是否适用于您的情况,但请尝试像这样运行grinder代理。
java net.grinder.Grinder -daemon 2
该命令的作用是,当grinder无法连接到控制台或由于某种原因连接丢失时,它会休眠一段时间并运行尝试重新连接。我预感到这可能会解决你的问题。
此处的文档非常少,但这里是我得到此文件的来源。