У меня есть приложение WPF, которое управляет аудио оборудованием. Он использует один и тот же PythonEngine для нескольких потоков. Это вызывает странные ошибки, которые я вижу время от времени, когда словарь PythonEngines Globals имеет отсутствующие значения. Я ищу некоторые рекомендации относительно того, как отлаживать/исправлять это.C# Запуск IronPython на несколько потоков
Устройство имеет несколько компонентов [фильтр, коэффициент усиления и т. Д.]. Каждый компонент имеет несколько элементов управления [ползунок, переключатели и т. Д.].
Каждый раз, когда пользователь меняет контрольное значение, должен запускаться скрипт python (от поставщика оборудования). Я использую IronPython 1.1.2 (PythonEngine.Execute (code)), чтобы сделать это.
У каждого компонента есть сценарий. И каждый сценарий требует, чтобы текущие значения всех элементов управления (этого компонента) запускались.
Последовательность - пользователь выполняет изменение> запустить компонентный скрипт> отправить результаты на устройство> проверить ответ на отказ. Весь этот цикл занимает слишком много времени, чтобы поддерживать пользовательский интерфейс, поэтому каждый раз что-то меняется. Я делаю что-то вроде component.begininvoke (startcycle).
Startcycle выглядит примерно так -
PyEngine Engine = PyEngine.GetInstance(); // this is a singleton
lock(component) // this prevents diff controls of the same component from walking over each other
{
Engine.runcode(...)
}
Когда различных component.begininvokes случиться близко друг к другу есть шансы, где engine.runcode происходит на разных потоках одновременно. Похоже, мне нужно избавиться от компонента.begininvoke, но это заставит вещи сканировать. Есть идеи?
вы отправили это год назад, но я исследую решения для аналогичной проблемы. Вы в конечном итоге заставить его работать? Я думал, что это не одновременный доступ к движку, который вызывает проблемы, но, возможно, вам нужно создать отдельный ScriptScope для каждого потока. Мне любопытно узнать, как вы решили решить свою проблему. – Dave