python - 是否可以使用多线程使 OpenOpc 读取更快的 OPC 项目?
问题描述
我正在使用 OpenOPC https://github.com/Alexhll/OpenOPC-python3.6/blob/master/src/OpenOPC.py 和 opcua libs 为 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 客户端只请求节点一级子节点。
您不能使用多线程,除非您得到前一个请求的回复,否则无法发送新请求。
推荐阅读
- ios - 如何在模拟器 iOS 13 中使用暗模式?
- docker - 是否可以在 Dockerfile 中指定使用官方镜像作为基础?
- javascript - CSS/Js - 当换行符和元素位于第一个位置时隐藏元素并更改 css
- python - 任意深度嵌套循环
- django - 表单未在 Django Admin 上注册
- c++ - 静态类模板实例作为成员导致未解决的外部符号错误
- batch-file - FINDSTR 结果在文本 csv 中没有换行符
- reactjs - Wowza 与 react js
- node.js - 使用 Docker Compose 在 Docker 中运行 React 不起作用
- cython - 诗歌 + 狮身人面像 + Cython