【发布时间】:2021-03-27 22:25:18
【问题描述】:
可以使用Application.Run 方法将 VBA 类(COM 对象)从一个托管 VBA 进程传递到另一个(例如,将 Excel.exe 的一个实例传递给另一个)。这意味着第二个进程(线程 2)将有权访问第一个进程(线程 1)中定义的代码。
因此,第二个线程可能会从线程 1 调用对象上的一个方法,该方法使用第一个线程的解释器运行,因此线程 1 的解释器同时从线程 1 和线程 2 调用。
这对任何人来说可能都不足为奇,但对我来说却是这样,因为 VBA 是作为单线程语言实现的(它都在宿主应用程序的 UI 线程中运行!)并且没有为您提供编写多线程代码的语法。基于此,我认为 VBA 解释器肯定不是线程安全的,并且不允许从其他线程执行。但显然你可以,而且我过去也将 VBA 对象传递给 python 库(我想它们在 python 解释器的单独线程上运行)。
那么它是如何完成的,VBA 是否有像 Python 一样的 GIL - 这意味着解释器一次只能由一个线程运行,或者还有其他事情发生吗?有什么方法可以检查吗?
【问题讨论】:
-
不,VBA 依赖于它创建的 STA 单元提供的线程保证。来自工作线程(不是由 VBA 创建)的调用会自动封送到 VBA 主线程。实际上与 JavaScript 执行模型非常相似。
-
@HansPassant 所以同步来自阻塞线程 2 的 com 代理,直到它发布并接收来自线程 1 的消息?
-
没错。
标签: vba multithreading mutex interpreter gil