- 浏览: 2663603 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
jython30个并发性能下降比较明显,有超时现象:
<urlopen error timed out> /napi/blog/detail/?blog_id=45756664
cost:2.00654006004
cost:1.49004387856
cost:0.0366380214691
cost:1.3818898201
cost:1.11271309853
cost:0.0867030620575
cost:0.51217007637
<urlopen error timed out> /napi/blog/detail/?blog_id=45705708
jstack看了一下大量被IdImpl.id()BLOCKED了
"catalina-exec-111" daemon prio=10 tid=0x00002aaac0844000 nid=0x1a91 waiting for monitor entry [0x0000000052436000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.python.core.IdImpl.id(IdImpl.java:76)
- waiting to lock <0x0000000704407ec8> (a org.python.core.IdImpl)
at org.python.core.Py.id(Py.java:1830)
at org.python.core.__builtin__.id(__builtin__.java:667)
at org.python.core.BuiltinFunctions.__call__(__builtin__.java:82)
at org.python.core.PyObject.__call__(PyObject.java:407)
at copy$py._keep_alive$13(/data1/duitang/dist/sys/jython/Lib/copy.py:281)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:149)
at org.python.core.PyFunction.__call__(PyFunction.java:357)
at copy$py.deepcopy$7(/data1/duitang/dist/sys/jython/Lib/copy.py:194)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyFunction.function___call__(PyFunction.java:406)
at org.python.core.PyFunction.__call__(PyFunction.java:401)
at django.db.models.sql.query$py.clone$18(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py:291)
at django.db.models.sql.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
at org.python.core.PyMethod.__call__(PyMethod.java:109)
at django.db.models.query$py._clone$47(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py:762)
at django.db.models.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
看了jython的实现大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在 public synchronized long id(PyObject o)方法前面直接加上 synchronized。
看了大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在方法前面直接加上 synchronized。
这是他自己实现的WeakIdentityMap:
引用
<urlopen error timed out> /napi/blog/detail/?blog_id=45756664
cost:2.00654006004
cost:1.49004387856
cost:0.0366380214691
cost:1.3818898201
cost:1.11271309853
cost:0.0867030620575
cost:0.51217007637
<urlopen error timed out> /napi/blog/detail/?blog_id=45705708
jstack看了一下大量被IdImpl.id()BLOCKED了
引用
"catalina-exec-111" daemon prio=10 tid=0x00002aaac0844000 nid=0x1a91 waiting for monitor entry [0x0000000052436000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.python.core.IdImpl.id(IdImpl.java:76)
- waiting to lock <0x0000000704407ec8> (a org.python.core.IdImpl)
at org.python.core.Py.id(Py.java:1830)
at org.python.core.__builtin__.id(__builtin__.java:667)
at org.python.core.BuiltinFunctions.__call__(__builtin__.java:82)
at org.python.core.PyObject.__call__(PyObject.java:407)
at copy$py._keep_alive$13(/data1/duitang/dist/sys/jython/Lib/copy.py:281)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:149)
at org.python.core.PyFunction.__call__(PyFunction.java:357)
at copy$py.deepcopy$7(/data1/duitang/dist/sys/jython/Lib/copy.py:194)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyFunction.function___call__(PyFunction.java:406)
at org.python.core.PyFunction.__call__(PyFunction.java:401)
at django.db.models.sql.query$py.clone$18(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py:291)
at django.db.models.sql.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
at org.python.core.PyMethod.__call__(PyMethod.java:109)
at django.db.models.query$py._clone$47(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py:762)
at django.db.models.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
看了jython的实现大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在 public synchronized long id(PyObject o)方法前面直接加上 synchronized。
package org.python.core; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.Map; import org.python.util.Generic; public class IdImpl { private WeakIdentityMap idMap = new WeakIdentityMap(); private long sequentialId; public synchronized long id(PyObject o) { Object javaProxy = o.getJavaProxy(); if (javaProxy != null) { return java_obj_id(javaProxy); } else { return java_obj_id(o); } } public String idstr(PyObject o) { return String.format("0x%x", id(o)); } public synchronized long java_obj_id(Object o) { Long cand = (Long)idMap.get(o); if (cand == null) { long new_id = ++sequentialId; idMap.put(o, new_id); return new_id; } return cand.longValue(); } }
看了大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在方法前面直接加上 synchronized。
这是他自己实现的WeakIdentityMap:
public static class WeakIdentityMap { private transient ReferenceQueue<Object> idKeys = new ReferenceQueue<Object>(); private Map<WeakIdKey, Object> objHashcodeToPyId = Generic.map(); @SuppressWarnings("element-type-mismatch") private void cleanup() { Object k; while ((k = idKeys.poll()) != null) { objHashcodeToPyId.remove(k); } } private class WeakIdKey extends WeakReference<Object> { private final int hashcode; WeakIdKey(Object obj) { super(obj, idKeys); hashcode = System.identityHashCode(obj); } @Override public int hashCode() { return hashcode; } @Override public boolean equals(Object other) { Object obj = get(); if (obj != null) { return obj == ((WeakIdKey)other).get(); } else { return this == other; } } } // Used by test_jy_internals public int _internal_map_size() { return objHashcodeToPyId.size(); } public void put(Object key, Object val) { cleanup(); objHashcodeToPyId.put(new WeakIdKey(key), val); } public Object get(Object key) { cleanup(); return objHashcodeToPyId.get(new WeakIdKey(key)); } public void remove(Object key) { cleanup(); objHashcodeToPyId.remove(new WeakIdKey(key)); } }
相关推荐
3. **创建测试用例**:编写一个JUnit测试用例,用以启动Jython程序并设置断点。例如,创建一个`test`方法,通过`PythonInterpreter`执行Jython脚本,并在适当位置设置断点。 ```java @Test public void test() { /...
10. **测试驱动开发(TDD)**:Jython可以与JUnit等Java测试框架结合,支持TDD实践,促进代码质量。 通过《Jython for Java Programmers》这本书,读者将学习如何利用Jython进行Java开发,理解两者之间的交互,以及...
它包含一个记录Jython测试脚本的HTTP代理,一个用于回放测试的命令行实用程序。代理记录器自动存储提交到表单的变量。 简介:MaxQ是一个开源的Web功能测试工具。它包含...
关于Imagrium是一个 Jython 框架,用于基于图像识别方法(并根据 MIT 许可条款分发)移动应用程序的跨平台测试。 该框架的核心原则(反映在其设计中)是: 在平台之间共享测试代码库。 换句话说,功能测试应该与应用...
6. **脚本化测试**:Monkey测试支持自定义脚本,通过Jython或其他脚本语言编写特定的测试逻辑,提高测试的针对性。 7. **MonkeyRunner**:MonkeyRunner是Android SDK中的一个组件,它提供了一个Python接口来编写...
1. **Grinder**:Grinder是一款基于JVM的开源压力测试框架,它支持Jython脚本引擎,可以通过HTTP代理进行HTTP测试。Grinder的优势在于它允许程序员深入测试应用的各个层次,而不只是表面的响应时间。 2. **Pylot**...
1. Grinder:Grinder是一款基于JVM的开源负载测试框架,它支持Jython脚本编写测试脚本,通过HTTP代理管理HTTP测试。Grinder的目标用户是有深入技术理解的开发者,因为它允许对应用的内部层次进行测试,而不仅仅是...
3. **加载和运行脚本**:作为一个独立的应用程序,Console4Jython支持直接加载和运行Jython脚本文件,使得开发和测试Jython程序变得更加便捷。用户无需通过命令行或者集成开发环境(IDE)来执行代码,只需在控制台中...
- **Worker 进程**:解释执行 Jython 测试脚本,并使用多个工作线程来执行测试任务。 - **Agent 进程**:管理 Worker 进程。 - **控制台(Console)**:协调其他进程的工作,收集并展示统计信息,同时提供脚本编辑和...
- 编写Jython测试类并运行。 总结:本文档详细阐述了在Windows XP环境下安装Python 2.6及其相关依赖,包括Setuptools和MySQL驱动,并提供了Eclipse与PyDev的集成配置方法,以便进行Python自动化测试框架的开发。...
录制回放功能通过脚本录制功能实现,允许测试人员记录操作序列并生成mr脚本文件。之后,可以使用回放功能来重复执行先前的操作序列。 在编写MonkeyRunner测试脚本时,尽管使用的是Python语法,但实际执行是通过...
Proxy用于记录用户交互,Agent在目标系统上生成负载,Controller协调和控制整个测试过程。 三、运行步骤 1. 启动Proxy:运行`grinder_proxy`命令,这将启动一个监听特定端口(默认为6314)的代理服务器,记录用户...
其中,`-n`表示非GUI模式,`-t`指定要运行的JMX测试计划文件,`-l`用于指定结果文件,`-j`则用于记录JMeter的运行日志。这种方式可以避免GUI对系统资源的影响,特别是在大量并发测试时。 接下来,我们来看插件的...
7. **插件和集成**:Robot Framework可以与各种工具集成,如Selenium WebDriver用于Web UI测试,Appium for移动应用测试,Jython/IronPython支持在Java/.NET环境中运行。 8. **版本控制**:使用版本控制系统(如Git...
它提供了一系列关键字,方便测试人员执行SQL查询、操作数据库记录、验证数据完整性和一致性等任务。这个库适用于各种关系型数据库,如MySQL、PostgreSQL、Oracle、SQL Server等,通过适配器机制与不同的数据库管理...
pop800在线工具,免费在的三纯正Grinder是一个负载测试框架,通过Jython来编写测试脚本,基于HTTP的测试可以由浏览器来记录整个要测试的过程。 关键特性: 泛型测试方法 灵活的测试脚本编写