Skip to content

Commit afd62cd

Browse files
Minor initialization weak (#9460)
1 parent 3f5eefd commit afd62cd

3 files changed

Lines changed: 50 additions & 9 deletions

File tree

Common/Python/PythonInitializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public static void Shutdown()
8383
try
8484
{
8585
var pyLock = Py.GIL();
86+
Log.Trace($"PythonInitializer.Shutdown(): calling engine shutdown...");
8687
PythonEngine.Shutdown();
8788
}
8889
catch (Exception ex)

Engine/LeanEngineAlgorithmHandlers.cs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ namespace QuantConnect.Lean.Engine
3636
/// </summary>
3737
public class LeanEngineAlgorithmHandlers : IDisposable
3838
{
39+
private static IFactorFileProvider _factorFileProvider;
40+
private static IMapFileProvider _mapfileProvider;
41+
private static IDataProvider _dataProvider;
42+
3943
private bool _dataMonitorWired;
4044

4145
/// <summary>
@@ -190,6 +194,37 @@ public LeanEngineAlgorithmHandlers(IResultHandler results,
190194
}
191195
}
192196

197+
/// <summary>
198+
/// Creates and initializes the auxiliary data providers from configuration
199+
/// </summary>
200+
public static (IMapFileProvider, IFactorFileProvider, IDataProvider) InitializeAuxiliaryDataProviders(bool setGlobals = false)
201+
{
202+
if (_mapfileProvider != null)
203+
{
204+
Log.Trace("LeanEngineAlgorithmHandlers.InitializeAuxiliaryDataProviders(): reusing existing instances");
205+
return (_mapfileProvider, _factorFileProvider, _dataProvider);
206+
}
207+
208+
var mapFileProviderTypeName = Config.Get("map-file-provider", "LocalDiskMapFileProvider");
209+
var factorFileProviderTypeName = Config.Get("factor-file-provider", "LocalDiskFactorFileProvider");
210+
var dataProviderTypeName = Config.Get("data-provider", "DefaultDataProvider");
211+
212+
var mapFileProvider = Composer.Instance.GetExportedValueByTypeName<IMapFileProvider>(mapFileProviderTypeName);
213+
var factorFileProvider = Composer.Instance.GetExportedValueByTypeName<IFactorFileProvider>(factorFileProviderTypeName);
214+
var dataProvider = Composer.Instance.GetExportedValueByTypeName<IDataProvider>(dataProviderTypeName);
215+
216+
factorFileProvider.Initialize(mapFileProvider, dataProvider);
217+
mapFileProvider.Initialize(dataProvider);
218+
219+
if (setGlobals)
220+
{
221+
_mapfileProvider = mapFileProvider;
222+
_factorFileProvider = factorFileProvider;
223+
_dataProvider = dataProvider;
224+
}
225+
return (mapFileProvider, factorFileProvider, dataProvider);
226+
}
227+
193228
/// <summary>
194229
/// Creates a new instance of the <see cref="LeanEngineAlgorithmHandlers"/> class from the specified composer using type names from configuration
195230
/// </summary>
@@ -199,14 +234,12 @@ public LeanEngineAlgorithmHandlers(IResultHandler results,
199234
/// <exception cref="CompositionException">Throws a CompositionException during failure to load</exception>
200235
public static LeanEngineAlgorithmHandlers FromConfiguration(Composer composer, bool researchMode = false)
201236
{
237+
var (mapFileProvider, factorFileProvider, dataProvider) = InitializeAuxiliaryDataProviders();
202238
var setupHandlerTypeName = Config.Get("setup-handler", "ConsoleSetupHandler");
203239
var transactionHandlerTypeName = Config.Get("transaction-handler", "BacktestingTransactionHandler");
204240
var realTimeHandlerTypeName = Config.Get("real-time-handler", "BacktestingRealTimeHandler");
205241
var dataFeedHandlerTypeName = Config.Get("data-feed-handler", "FileSystemDataFeed");
206242
var resultHandlerTypeName = Config.Get("result-handler", "BacktestingResultHandler");
207-
var mapFileProviderTypeName = Config.Get("map-file-provider", "LocalDiskMapFileProvider");
208-
var factorFileProviderTypeName = Config.Get("factor-file-provider", "LocalDiskFactorFileProvider");
209-
var dataProviderTypeName = Config.Get("data-provider", "DefaultDataProvider");
210243
var objectStoreTypeName = Config.Get("object-store", "LocalObjectStore");
211244
var dataPermissionManager = Config.Get("data-permission-manager", "DataPermissionManager");
212245
var dataMonitor = Config.Get("data-monitor", "QuantConnect.Data.DataMonitor");
@@ -217,9 +250,9 @@ public static LeanEngineAlgorithmHandlers FromConfiguration(Composer composer, b
217250
composer.GetExportedValueByTypeName<IDataFeed>(dataFeedHandlerTypeName),
218251
composer.GetExportedValueByTypeName<ITransactionHandler>(transactionHandlerTypeName),
219252
composer.GetExportedValueByTypeName<IRealTimeHandler>(realTimeHandlerTypeName),
220-
composer.GetExportedValueByTypeName<IMapFileProvider>(mapFileProviderTypeName),
221-
composer.GetExportedValueByTypeName<IFactorFileProvider>(factorFileProviderTypeName),
222-
composer.GetExportedValueByTypeName<IDataProvider>(dataProviderTypeName),
253+
mapFileProvider,
254+
factorFileProvider,
255+
dataProvider,
223256
composer.GetExportedValueByTypeName<IObjectStore>(objectStoreTypeName),
224257
composer.GetExportedValueByTypeName<IDataPermissionManager>(dataPermissionManager),
225258
Globals.LiveMode,

Launcher/Program.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,19 @@ public static void Exit(int exitCode)
138138
// clean up resources
139139
leanEngineSystemHandlers.DisposeSafely();
140140
leanEngineAlgorithmHandlers.DisposeSafely();
141-
Log.LogHandler.DisposeSafely();
142141
OS.Dispose();
143-
144-
PythonInitializer.Shutdown();
142+
try
143+
{
144+
var isolator = new Isolator();
145+
isolator.ExecuteWithTimeLimit(TimeSpan.FromSeconds(10), PythonInitializer.Shutdown, -1);
146+
}
147+
catch (Exception ex)
148+
{
149+
Log.Error(ex, $"Failed to shutdown python");
150+
}
145151

146152
Log.Trace("Program.Main(): Exiting Lean...");
153+
Log.LogHandler.DisposeSafely();
147154
Environment.Exit(exitCode);
148155
}
149156
}

0 commit comments

Comments
 (0)