internal async void InitializeWebhostLanguageWorkerChannel() { _logger.LogDebug("Creating new webhost language worker channel for runtime:{workerRuntime}.", _workerRuntime); ILanguageWorkerChannel workerChannel = await _webHostLanguageWorkerChannelManager.InitializeChannelAsync(_workerRuntime); workerChannel.SetupFunctionInvocationBuffers(_functions); workerChannel.SendFunctionLoadRequests(); }
public async Task InitializeAsync(IEnumerable <FunctionMetadata> functions) { if (_environment.IsPlaceholderModeEnabled()) { return; } _workerRuntime = _workerRuntime ?? Utility.GetWorkerRuntime(functions); _functions = functions; if (string.IsNullOrEmpty(_workerRuntime) || _workerRuntime.Equals(LanguageWorkerConstants.DotNetLanguageWorkerName, StringComparison.InvariantCultureIgnoreCase)) { // Shutdown any placeholder channels for empty function apps or dotnet function apps. // This is needed as specilization does not kill standby placeholder channels if worker runtime is not set. // Debouce to ensure this does not effect cold start _shutdownStandbyWorkerChannels(); return; } if (functions == null || functions.Count() == 0) { // do not initialize function dispachter if there are no functions return; } if (Utility.IsSupportedRuntime(_workerRuntime, _workerConfigs)) { State = FunctionDispatcherState.Initializing; Dictionary <string, TaskCompletionSource <ILanguageWorkerChannel> > webhostLanguageWorkerChannels = _webHostLanguageWorkerChannelManager.GetChannels(_workerRuntime); if (webhostLanguageWorkerChannels != null) { foreach (string workerId in webhostLanguageWorkerChannels.Keys) { if (webhostLanguageWorkerChannels.TryGetValue(workerId, out TaskCompletionSource <ILanguageWorkerChannel> initializedLanguageWorkerChannelTask)) { _logger.LogDebug("Found initialized language worker channel for runtime: {workerRuntime} workerId:{workerId}", _workerRuntime, workerId); ILanguageWorkerChannel initializedLanguageWorkerChannel = await initializedLanguageWorkerChannelTask.Task; initializedLanguageWorkerChannel.SetupFunctionInvocationBuffers(_functions); initializedLanguageWorkerChannel.SendFunctionLoadRequests(); } } StartWorkerProcesses(webhostLanguageWorkerChannels.Count(), InitializeWebhostLanguageWorkerChannel); State = FunctionDispatcherState.Initialized; } else { await InitializeJobhostLanguageWorkerChannelAsync(0); StartWorkerProcesses(1, InitializeJobhostLanguageWorkerChannelAsync); } } }