是否可以使用多线程使 OpenOpc 读取更快的 OPC 项目?
Is it possibile to use mutithreading to make OpenOpc read faster OPC items?
我正在使用 OpenOPC https://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
感谢您的帮助!
这就像有一个数据库,一开始就查询全部内容,对我来说意义不大。
我编写的OPC UA客户端,每次用户在浏览器中展开节点时,只请求节点一级子节点。
您不能使用多线程,只有收到前一个请求的回复才能发送新请求。
我正在使用 OpenOPC https://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
感谢您的帮助!
这就像有一个数据库,一开始就查询全部内容,对我来说意义不大。
我编写的OPC UA客户端,每次用户在浏览器中展开节点时,只请求节点一级子节点。
您不能使用多线程,只有收到前一个请求的回复才能发送新请求。