Можно ли использовать многопоточность, чтобы OpenOpc читал быстрее элементы OPC? - PullRequest
2 голосов
/ 21 октября 2019

Я использую 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

Спасибо за помощь!

1 Ответ

1 голос
/ 03 ноября 2019

Это все равно что иметь базу данных и запрашивать все содержимое в начале, что для меня мало смысла.

Программируемый мной клиент OPC UA запрашивает только дочерние узлы первого уровня каждый раз, когда пользователь расширяетсяузел в браузере.

Вы не можете использовать многопоточность, новый запрос не может быть отправлен, пока вы не получите ответ от предыдущего.

...