У меня есть класс "script" в IronPython, а скриптинг в моем приложении работает, вызывая методы на его экземпляре. Мне нужно реализовать сценарии вызова из нескольких потоков. Каков правильный способ сделать это?
У меня много проблем:
-
Является
ScriptScope
потокобезопасным? Информация противоречива. Документация ScriptScope гласит: "ScriptScope не является потокобезопасным. Хост должен либо заблокировать, когда несколько потоков могут получить доступ к одному модулю, либо сделать копию для каждого нить." Однако IronRuby использует одну и ту же DLR и @JimmySchementi говорит, что "ScriptRuntime, ScriptEngine и ScriptScope все поточно-безопасные, предназначенные для использования между потоками. В частности, ScriptScope использует потокобезопасное хранилище данных, поэтому ScriptScope может совместно использоваться потоками". -
Если я создам несколько
ScriptScope
s, это будет означать выполнение одной и той же инициализации script несколько раз. Предположим, что я запустил десять файлов Python script, импортировал пять сборок и в целом выполнил совсем немного кода, чтобы получить объект "script". Есть ли способ избежать затрат времени и памяти на запуск большого количества одного и того же кода для каждого потока? -
Создает ли переменная
ScriptScope
thread-static (т.е. применяетThreadStaticAttribute
) и выполняет инициализацию для каждого потока, который используетсяTask.Run
как идти? Или я должен использоватьTaskScheduler
с ограничением на concurrency, потому что стоимость нескольких областей видимости высока?
В целом: как правильно реализовать запуск того же script для разных аргументов в нескольких потоках? Скрипты должны выполняться одновременно и не должны вылетать из-за условий гонки.