pywinauto не корректно работает в режиме многопоточности
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.
Источник: Stack Overflow на русском