可以使用多线程处理使OpenOpc读取更快的OPC项吗?

问题描述 投票:1回答:1

我正在使用OpenOPChttps://github.com/Alexhll/OpenOPC-python3.6/blob/master/src/OpenOPC.py和opcua库来为opc da(客户端)代理到opc da(服务器)。为了使其正常工作,我使用了OpenOPC的方法]

nodes = c.list('*',recursive=True)

以发现opc da服务器的所有节点。但是要发现10000个项目,大约需要3分钟,所以我想使其更快。通过调试一点OpenOPC库,我发现花费更多时间的行是

if lowest_level:  matches = [exceptional(browser.GetItemID,x)(x) for x in matches]

在第1096行。我坚信,一个好的方法可能是使用带有池映射的多线程,但是由于装饰器,我无法将其转换为多线程。是否有可能进行这种改进,或者我对这个想法完全错了?我试过的是没有运气的,我明白蜜蜂错了。

matches =pool.map(exceptional,matches)

这里是第103行中来自库的特殊方法:

def exceptional(func, alt_return=None, alt_exceptions=(Exception,), final=None, catch=None):
   """Turns exceptions into an alternative return value"""

   def _exceptional(*args, **kwargs):
      try:
         try:
            return func(*args, **kwargs)
         except alt_exceptions:
            return alt_return
         except:
            if catch: return catch(sys.exc_info(), lambda:func(*args, **kwargs))
            raise
      finally:
         if final: final()
   return _exceptional

谢谢您的帮助!

python opc opc-ua
1个回答
0
投票

这就像是拥有一个数据库并在一开始就查询全部内容,对我来说意义不大。

我编程的OPC UA客户端每次用户在浏览器中展开节点时仅请求节点一级子节点。

您不能使用多线程,在收到上一个请求的答复之前,无法发送新请求。

© www.soinside.com 2019 - 2024. All rights reserved.