Использование win32com с многопоточным

Я работаю над веб-приложением с CherryPy, которому необходимо получить доступ к нескольким приложениям через COM.

Сейчас я создаю новый экземпляр приложения с каждым запросом, что означает, что каждый запрос ждет 3 секунды для запуска приложения и 0.01 для фактического задания.

Я хотел бы запустить каждое приложение COM один раз и сохранить его в живых и повторно использовать его в течение нескольких секунд по следующим запросам, потому что большую часть времени он используется пакетом из 5-10 запросов ajax, а затем ничего в течение нескольких часов.

Можно ли использовать COM-abject для всех потоков приложения CherryPy?

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

Следующий код успешно запускает и останавливает Excel:

>>> import pythoncom, win32com.client >>> def start(): global xl xl = win32com.client.Dispatch('Excel.Application') >>> def stop(): global xl xl.quit() xl = None >>> start() >>> stop() 

Но следующий код запускает Excel и закрывает его через 3 секунды.

 >>> import pythoncom, win32com.client, threading, time >>> def start(): global xl pythoncom.CoInitialize() xl = win32com.client.Dispatch('Excel.Application') time.sleep(3) >>> threading.Thread(target=start).start() 

Я добавил вызов CoInitialize() иначе объект xl не будет работать (см. Этот пост ).

И я добавил 3-секундную паузу, поэтому я мог видеть в диспетчере задач, что процесс EXCEL.EXE запущен и жив в течение 3 секунд.

Почему он умирает после того, как поток начал его завершение?

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

  • Как создать контекстное меню расширения оболочки в Python (например, Dropbox)
  • Доступ к данным в Excel - Reuter из python
  • Серия Python - Extra Excel с win32com
  • Доступ к незарегистрированным COM-объектам из python через зарегистрированный TLB
  • Как подождать, пока Excel не вычислит формулы, прежде чем продолжить с win32com
  • есть ли хороший пример использования pywin32 createprocessasuser и получения результата?
  • iTunes API для скриптов python
  • Интересный «getElementById () принимает ровно 1 аргумент (2 данный)», иногда это происходит. Может кто-нибудь объяснить это?
  • One Solution collect form web for “Использование win32com с многопоточным”

    Если вы хотите использовать win32com в нескольких потоках, вам нужно немного поработать, поскольку COMObject не может быть передан в поток напрямую. Вам нужно использовать CoMarshalInterThreadInterfaceInStream() и CoGetInterfaceAndReleaseStream() для передачи экземпляра между потоками:

     import pythoncom, win32com.client, threading, time def start(): # Initialize pythoncom.CoInitialize() # Get instance xl = win32com.client.Dispatch('Excel.Application') # Create id xl_id = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, xl) # Pass the id to the new thread thread = threading.Thread(target=run_in_thread, kwargs={'xl_id': xl_id}) thread.start() # Wait for child to finish thread.join() def run_in_thread(xl_id): # Initialize pythoncom.CoInitialize() # Get instance from the id xl = win32com.client.Dispatch( pythoncom.CoGetInterfaceAndReleaseStream(xl_id, pythoncom.IID_IDispatch) ) time.sleep(5) if __name__ == '__main__': start() 

    Для получения дополнительной информации см. https://mail.python.org/pipermail/python-win32/2008-June/007788.html.

    Interesting Posts

    Как вы исправляете уже загруженные пользователем UserWarnings в Python?

    Ошибка проверки формы управления Django Formset

    "SyntaxError: non-keyword arg after keyword arg" Ошибка в Python при использовании запросов.post ()

    Использование% f с strftime () в Python для получения микросекунд

    Набор запросов Django-фильтра на «кортежи» значений для нескольких столбцов

    Техника удаления общих слов (и их множественных версий) из строки

    Получить дату и время установки для пакетов, установленных через pip

    Как я могу найти все возможные комбинации списка списков (в Python)?

    Что такое termios.TIOCGWINSZ

    Сделать случайный модуль потокобезопасным в Python

    Python 3.3 CSV.Writer пишет дополнительные пустые строки

    django – получить последнюю запись с фильтром

    Как добавить путь импорта Python с использованием .pth файла

    Python – цитата с обратной косой чертой в струнных литералах

    Как установить PyGObject с поддержкой Python 3

    Python - лучший язык программирования в мире.