我正在使用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对象将无法工作(请参见this post)。
我添加了3秒钟的暂停,这样我就可以在任务管理器上看到EXCEL.EXE进程启动并保持3秒钟的活动状态。
为什么在开始它的线结束后它就死了?
我查看了^{}的文档,但是我不知道是否可以让它在多线程环境中工作。