我正在使用CherryPy开发一个Web应用程序,需要通过COM访问几个应用程序。
目前,我每次请求都会创建一个新的应用程序实例,这意味着每个请求需要等待3秒钟应用程序启动并且0.01秒完成实际工作。
我想一次启动每个COM应用程序并保持其活动状态,以便在以下几个请求中重复使用它几秒钟,因为大多数时间它被突发的5-10个Ajax请求使用,然后几个小时没有使用。
是否可以跨CherryPy应用程序的所有线程共享一个COM对象?
以下是几个实验的摘要,展示了它如何在每个请求中工作以及它如何无法跨线程工作。
以下代码成功地启动和停止了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
对象将无法工作(请参见此帖子)。
并且我添加了三秒钟的暂停时间,这样我就可以在任务管理器上看到EXCEL.EXE进程启动并保持运行状态三秒钟。
为什么它会在启动它的线程结束后死亡呢?
我查阅了CoInitialize()
的文档,但我无法理解它是否可以在多线程环境中工作。
COINIT_APARTMENTTHREADED
选项的CoInitializeEx。 - tdelaney