Я использую 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)
вот исключительный метод из libs в строке 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
Спасибо за помощь!