Имеет ли смысл всегда использовать асинхронные пользовательские функции в xlwings для обновления ячеек? - PullRequest
0 голосов
/ 17 декабря 2018

Для пользовательских функций xlwings, которые возвращают результат, который будет записан в ячейку Excel, имеет ли смысл всегда делать UDF асинхронным, чтобы Excel не зависал при обработке UDF?

Существуют ли ситуации, когдалучше не использовать асинхронные UDF?

https://docs.xlwings.org/en/stable/udfs.html#asynchronous-udfs

Я использую Excel 2016 и Windows 10

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если вам нужны асинхронные функции, которые правильно работают с Excel, а не просто записывает значения обратно в Excel с помощью COM позже, вам следует использовать асинхронные функции Excel или функции RTD (данные в реальном времени).AFAIK, xlwings не использует ни один из них.

Асинхронные функции Excel отличаются от использования фонового потока для последующей записи результата в Excel.Они выполняются во время цикла вычислений Excel, но позволяют одновременно выполнять вычисления, чтобы другие вычисления не блокировались, например, при одном ожидании ввода-вывода.

Если у вас есть функция длительного выполнения и вы не хотите иметьчтобы дождаться его возвращения, лучше использовать функцию RTD, которая обновляется один раз, когда результат готов.

PyXLL поддерживает как асинхронные, так и функции RTD (https://www.pyxll.com).

https://www.pyxll.com/docs/userguide/udfs.html#asynchronous-functions https://www.pyxll.com/docs/userguide/rtd.html

Еще один вариант - использовать поточно-ориентированные функции, которые запускаются в пуле фоновых потоков в Excel. Если у вас есть функции, которые могут выполняться одновременно (то есть они освобождают GILдля задач ввода-вывода или загрузки процессора), тогда это простой способ повысить производительность ваших листов.

Чтобы пометить функцию как поточно-ориентированную в PyXLL, вы просто указываете "thread_safe = True" при регистрации функцииНапример:

from pyxll import xl_func

@xl_func(thread_safe=True)
def my_thread_safe_function():
    pass
0 голосов
/ 17 декабря 2018

Я думаю, что реальный вопрос в том, когда использовать асинхронные UDF.Ответ на этот вопрос один и тот же, независимо от того, находимся ли мы в контексте xlwings.Я процитирую MSFT :

Некоторые пользовательские функции должны ожидать внешних ресурсов.Пока они ждут, поток вычислений Excel блокируется.Пользовательские функции могут выполняться асинхронно.Это освобождает поток вычислений для выполнения других вычислений, пока пользовательская функция ожидает.

Широкое использование асинхронной функции в Excel будет неэффективным, но я также подозреваю, что это может привести к ошибками неверное состояние приложения .Это мое мнение, основанное на моем опыте, но не подтвержденное официально, поэтому я с нетерпением жду возможности получить экспертное заключение.

...