对于返回将被写入Excel单元格的结果的xlwings,总是使UDF异步以便Excel在处理UDF时不冻结是否有意义?
在不使用异步UDF的情况下会更好吗?
https://docs.xlwings.org/en/stable/udfs.html#asynchronous-udfs
我正在使用Excel 2016和Windows 10
发布于 2018-12-17 13:45:47
我认为真正的问题是何时使用异步UDF。这个问题的答案是相同的,无论我们是否在xlwing的上下文中。我会引用MSFT的话
一些用户定义的函数必须等待外部资源。当他们等待时,Excel计算线程将被阻塞。用户定义的函数可以异步运行。这将释放计算线程,以便在用户定义函数等待时运行其他计算。
在Excel中广泛使用异步函数将效率低下,但我也怀疑它可能导致错误和不正确的应用程序状态。这是我的意见,根据我的经验,但没有正式确认,所以我期待有专家意见。
发布于 2020-09-26 14:57:10
您可以使用xlOil (免责声明:我写的)来完成这个任务。xlOil支持使用Excel的本地异步服务器和RTD服务器的异步函数。plugin的文档在这里:Python/index.html。
下面的python模块声明一个异步Excel函数longRunningFunction
import xloil
import asyncio
@xloil.func
async def longRunningFunction(returnVal, waitTime:int):
await asyncio.sleep(waitTime)
return returnVal默认情况下,xlOil使用RTD技术来完成这项工作,因为Excel的本机异步实际上并不是与UI异步的。这意味着,如果通过以任何方式与Excel交互来停止计算,则所有本机异步函数都将被取消。
RTD与UI是异步的,但是有一些开销,所以应该只在需要的地方使用。它还需要启用自动计算才能按预期工作,即在返回值时在Excel中显示值。(尽管您可以在UDF的末尾添加对Application.Calculate的延迟调用,但可以使用xloil.run_later()来避免这一要求)。讨论了xlOil文档的相对优势。
xlOil使用python的asyncio库,因此需要一个可访问的函数。如果您想要调用的python代码没有异步感知,那么您可以始终在一个新的进程中运行它,并使用concurrent.futures.ProcessPoolExecutor等待进程。
发布于 2018-12-17 16:16:43
如果需要与Excel正常工作的异步函数,而不只是稍后使用COM将值写入Excel,则应该使用Excel的异步函数或RTD (实时数据)函数。AFAIK,xlwing都不使用这两种。
Excel的异步函数与稍后使用后台线程将结果写回Excel不同。它们在Excel计算周期期间运行,但允许并行运行计算,因此其他计算不会在等待IO的计算中被阻塞。
如果您有一个长时间运行的函数,并且您不想等待它返回,最好使用一个RTD函数,在结果准备好时只更新一次。
PyXLL (https://www.pyxll.com)支持异步函数和RTD函数。
https://www.pyxll.com/docs/userguide/udfs.html#asynchronous-functions https://www.pyxll.com/docs/userguide/rtd.html
另一种选择是使用线程安全函数。它们在Excel中的后台线程池中运行。如果您有可以并发运行的函数(例如,它们为IO或CPU密集型任务释放GIL ),那么这是提高工作表性能的一种简单方法。
要用PyXLL将函数标记为线程安全,只需在注册该函数时指定"thread_safe=True“,例如:
from pyxll import xl_func
@xl_func(thread_safe=True)
def my_thread_safe_function():
passhttps://stackoverflow.com/questions/53815748
复制相似问题