start to prepare python plugin
查到initPlugin
下调用了BuildPlugin
NewCaseRunner
的时候调用了initPlugin
NewCaseRunner
函数
plugin
的操作
130G
内存,显然也不是很好NewCaseRunner
,在调用initPlugin
时增加限制,一个 debugtalk 只运行一次
综合考虑考虑下,采用2
方式会更加稳妥,缺点可以采用分布式压测做分流问题,分布式压测后续可以通过 k8s 部署多个工作节点
// Package hrp NewCaseRunner 方法下把initPlugin修改成cheetahInitPlugin
package hrp
func (r *HRPRunner) NewCaseRunner(testcase *TestCase) (*CaseRunner, error) {
caseRunner := &CaseRunner{
testCase: testcase,
hrpRunner: r,
parser: newParser(),
}
// init parser plugin
//plugin, err := initPlugin(testcase.Config.Path, r.venv, r.pluginLogOn)
//压测运行时会同时运行多个plugin,用单例方式控制每次压测任务只能运行一个plugin
plugin, err := cheetahInitPlugin(testcase.Config.Path, r.venv, r.pluginLogOn)
if err != nil {
return nil, errors.Wrap(err, "init plugin failed")
}
if plugin != nil {
caseRunner.parser.plugin = plugin
caseRunner.rootDir = filepath.Dir(plugin.Path())
}
// ... 省略其他代码
}
// Package hrp 增加 cheetahInitPlugin 函数
package hrp
import (
"github.com/httprunner/funplugin"
"github.com/pkg/errors"
"sync"
)
var cheetahPlugin = make(map[string]*funplugin.IPlugin)
var mutex sync.Mutex
func cheetahInitPlugin(path, venv string, logOn bool) (plugin funplugin.IPlugin, err error) {
plugins := cheetahPlugin[path]
if plugins == nil {
mutex.Lock()
defer mutex.Unlock()
if plugins == nil {
plugin, err = initPlugin(path, venv, logOn)
if err != nil {
return nil, errors.Wrap(err, "init plugin failed")
}
cheetahPlugin[path] = &plugin
plugins = &plugin
}
}
return *plugins, nil
}