【问题标题】:Connection Refused on Concurrent connection to openerp with xmlrpc (via python)Connection Refused on Concurrent connection to openerp with xmlrpc (via python)
【发布时间】:2017-01-13 10:27:33
【问题描述】:

我尝试构建一个压力测试系统,提供多个并发用户登录。该方案是 1 个线程用于 1 个用户登录。但我不能同时登录多个用户(并发)。

另一方面,我尝试使用多个用户以顺序方案登录(使用 thread.lock 和 thread.release 通过登录方法),它可以工作。

我可以在这样的python线程方案上同时与多个用户登录吗?

这是我的代码 (更新: 我已经更新了我的代码,现在我尝试使用多线程通过 xml_rpc 读取。 打开连接/登录没问题,但我总是得到阅读方法返回失败.. ):

这个线程类:

class theUser (threading.Thread):
    def __init__(self, threadID, row, dbhost, xml_port, dbuser, dbpassword, dbname):
        threading.Thread.__init__(self)
        self.threadID   = threadID
        self.name       = str(row[0])
        self.pswd       = str(row[1])
        self.msg        = ''
        self.xml_port   = xml_port
        self.params={'dbhost'   : dbhost,
                    'dbuser'    : dbuser,
                    'dbpassword': dbpassword,
                    'dbname'    : dbname,
                    'user'      : str(row[0]),
                    'password'  : str(row[1])
                }

    def run(self):
        try:
            self.sock_common    = xmlrpclib.ServerProxy ('http://%s:%s/xmlrpc/common' % (dbhost, xml_port))
            self.uid = self.sock_common.login(self.params['dbname'], self.name, self.pswd)                    

            self._read_data()

        except:
            return

    def _read_data(self):
        self.ids = [1,2,3,10]
        self.sock_common.execute(self.params['dbname'], self.uid, self.params['password'], 'res.partner', 'read', self.ids, ['name'])            

这是主要代码:

for row in reader:
    print idx, xml_port, row

    if idx == 0:
        header = row

    else:
        # Create new User threads
        thread_ = theUser(idx, row, dbhost, xml_port, dbuser, dbpassword, dbname)

        # Start new User Threads
        thread_.start()

        # Add threads to thread list    
        threads.append(thread_)

    idx += 1

请帮帮我..

【问题讨论】:

    标签: python multithreading openerp python-multithreading stress-testing


    【解决方案1】:

    你在创建theUser时忘记了xml_port,应该是:

    thread_ = theUser(idx, row, dbhost, xml_port, dbuser, dbpassword, dbname)
    

    如果引发异常,则不会设置 self.sock_common。您可以将其移至 run() 函数。

    阅读res.partner

    def _read_data(self):
        self.ids = [1,2,3,10]
        models = xmlrpclib.ServerProxy('http://%s:%s/xmlrpc/object' % (dbhost, xml_port))
        res = models.execute(self.params['dbname'], self.uid, self.params['password'], 'res.partner', 'read', self.ids, ['name'])
        print res
    

    您可以使用以下命令检查是否允许给定用户阅读:

    models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url))
    models.execute_kw(db, uid, password,
    'res.partner', 'check_access_rights',
    ['read'], {'raise_exception': False})
    

    如果用户可以阅读,它应该返回true

    此脚本来自Odoo Web Service API

    【讨论】:

    • 非常感谢 Kenly,现在我可以使用并发连接登录了。我已经更新了我的代码,现在我尝试使用多线程通过 xml_rpc 进行读取。打开连接/登录是可以的,但是我总是在阅读方法上得到失败返回..你也能帮我吗..
    • @green43 要阅读res.partner,我们需要使用xmlrpc/object。检查我的编辑。
    • Thx @Kenly,我试过了。现在我得到了这个结果:1. 一些线程成功登录 + 读取,2. 一些线程成功登录,但读取失败(我打印错误消息和它说 ) 3. 一些线程在登录时失败(我打印错误消息,它说 ,与读取错误信息相同)
    • 非常感谢,它运行良好.. :) 问题是为什么一些线程给出错误消息连接被拒绝?仅供参考,此线程/用户不是唯一的,例如:第一个测试结果是 user1 error Connection Refused,第二个测试结果是 user2 error Connection Refused。你有什么想法吗?我现在卡在里面了..
    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 2017-07-30
    • 2011-08-22
    • 2016-01-21
    • 2013-04-20
    • 2022-12-26
    • 2022-06-17
    • 2020-10-14
    相关资源
    最近更新 更多