`
san_yun
  • 浏览: 2597522 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

jython测试记录

 
阅读更多
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。

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));
        }

    }


分享到:
评论

相关推荐

    应用MaxQ做Web功能测试

    它包含一个记录Jython测试脚本的HTTP代理,一个用于回放测试的命令行实用程序。代理记录器自动存储提交到表单的变量。 简介:MaxQ是一个开源的Web功能测试工具。它包含...

    imagrium:Imagrium 是一个基于图像识别方法的移动应用跨平台测试的 Jython 框架(Android 和 iOS 应用测试自动化软件)

    关于Imagrium是一个 Jython 框架,用于基于图像识别方法(并根据 MIT 许可条款分发)移动应用程序的跨平台测试。 该框架的核心原则(反映在其设计中)是: 在平台之间共享测试代码库。 换句话说,功能测试应该与应用...

    pop800在线工具

    pop800在线工具,免费在的三纯正Grinder是一个负载测试框架,通过Jython来编写测试脚本,基于HTTP的测试可以由浏览器来记录整个要测试的过程。 关键特性: 泛型测试方法 灵活的测试脚本编写

    monkeyrunner环境搭建

    MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的...

    monkeyrunner详细介绍以及编写简单的python脚本

    MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的...

    staf-services:我的STAF服务

    软件测试自动化框架(STAF)是一个开放源代码,多平台,多语言的框架,围绕可重用​​组件(即服务(例如流程调用,资源管理,日志记录和监视))的概念而设计。 STAF消除了构建自动化基础架构的繁琐工作,因此使您...

    Python Cookbook

    1.3 测试一个对象是否是类字符串 8 1.4 字符串对齐 10 1.5 去除字符串两端的空格 11 1.6 合并字符串 11 1.7 将字符串逐字符或逐词反转 14 1.8 检查字符串中是否包含某字符集合中的字符 15 1.9 简化字符串的...

    Python核心编程第二版(ok)

     3.4.2 在主程序中书写测试代码   3.5 内存管理   3.5.1 变量定义   3.5.2 动态类型   3.5.3 内存分配   3.5.4 引用计数   3.5.5 垃圾收集   3.6 第一个Python程序   3.7 相关模块和开发...

    Python核心编程第二版

     3.4.2 在主程序中书写测试代码   3.5 内存管理   3.5.1 变量定义   3.5.2 动态类型   3.5.3 内存分配   3.5.4 引用计数   3.5.5 垃圾收集   3.6 第一个Python程序   3.7 相关模块和开发...

Global site tag (gtag.js) - Google Analytics