pywinauto не корректно работает в режиме многопоточности

Рейтинг: 1Ответов: 0Опубликовано: 10.02.2023

Expected Behavior

COM работают в отдельных потоках, в режиме многопоточности и не должны блокировать друг друга.

Actual Behavior

COM работают в отдельных потоках, в режиме многопоточности, но при этом, при блокировке одного из приложений, в хаотичном порядке блокируется второе приложение (на разных участках кода, до куда успеет дойти).

Steps to Reproduce the Problem

  • Из под разных корутин (asyncio) создается свой инстанс с Application(backend='UIA').connect(process=...)
  • Далее, каждая корутина поочередно запускает приложение 1С (авторизуется - Application(backend='UIA').start("...")), идет на создание и выгрузку отчета в 1С через GUI (pywinauto).
  • После нажатия на кнопку, блокирующую открытое окно сессии (приложения), передаю управление на другую корутину. Тут ожидаю выполнения посредством wait_cpu_usage_lower(threshold=0.2). Пока отчет выгружается, threshold находится в районе 7%.
  • На другой корутине, при блокировке предыдущей, python может встать в ожидание на любом участке кода pywinauto (хаотично), connect успевает выполниться корректно, top_window, set_focus, уже не всегда успевает. Далее методы pywinauto (window, descendants и т.п.) уже блокируются (очень часто, но тоже НЕ ВСЕГДА), пока не разблокируется приложение в первой корутине.
  • TID приложения во всех запущенных сессиях 1С одинаковый (win32api.GetCurrentThreadId). А вот PID и TID (win32process.GetWindowThreadProcessId) окон разные.
  • Сценарий, в данном случае, запускаю одинаковый, на одних и тех же данных.

Specifications

  • Pywinauto version: 0.6.4, т.к. только на ней 1С может работать в многопоточном режиме более-менее корректно.
  • Python version and bitness: python 3.7, 64x.
  • Platform and OS: приложение 1С Предприятие на Windows Server 2016 64x.

Ответы

Ответов пока нет.