public Task StartProcessAsync() { using (_metricsLogger.LatencyEvent(MetricEventNames.ProcessStart)) { Process = CreateWorkerProcess(); try { Process.ErrorDataReceived += (sender, e) => OnErrorDataReceived(sender, e); Process.OutputDataReceived += (sender, e) => OnOutputDataReceived(sender, e); Process.Exited += (sender, e) => OnProcessExited(sender, e); Process.EnableRaisingEvents = true; _workerProcessLogger?.LogDebug($"Starting worker process with FileName:{Process.StartInfo.FileName} WorkingDirectory:{Process.StartInfo.WorkingDirectory} Arguments:{Process.StartInfo.Arguments}"); Process.Start(); _workerProcessLogger?.LogDebug($"{Process.StartInfo.FileName} process with Id={Process.Id} started"); Process.BeginErrorReadLine(); Process.BeginOutputReadLine(); // Register process only after it starts _processRegistry?.Register(Process); RegisterWithProcessMonitor(); return(Task.CompletedTask); } catch (Exception ex) { _workerProcessLogger.LogError(ex, $"Failed to start Worker Channel. Process fileName: {Process.StartInfo.FileName}"); return(Task.FromException(ex)); } } }
public Task StartWorkerProcessAsync() { _startSubscription = _inboundWorkerEvents.Where(msg => msg.MessageType == MsgType.StartStream) .Timeout(TimeSpan.FromSeconds(LanguageWorkerConstants.ProcessStartTimeoutSeconds)) .Take(1) .Subscribe(SendWorkerInitRequest, HandleWorkerError); var workerContext = new WorkerContext() { RequestId = Guid.NewGuid().ToString(), MaxMessageLength = LanguageWorkerConstants.DefaultMaxMessageLengthBytes, WorkerId = _workerId, Arguments = _workerConfig.Arguments, WorkingDirectory = _rootScriptPath, ServerUri = _serverUri, }; _process = _processFactory.CreateWorkerProcess(workerContext); StartProcess(); _processRegistry?.Register(_process); _state = LanguageWorkerChannelState.Initializing; return(Task.CompletedTask); }
public Task StartProcessAsync() { try { _process.ErrorDataReceived += (sender, e) => OnErrorDataReceived(sender, e); _process.OutputDataReceived += (sender, e) => OnOutputDataReceived(sender, e); _process.Exited += (sender, e) => OnProcessExited(sender, e); _process.EnableRaisingEvents = true; _workerProcessLogger?.LogInformation($"Starting language worker process:{_process.StartInfo.FileName} {_process.StartInfo.Arguments}"); _process.Start(); _workerProcessLogger?.LogInformation($"{_process.StartInfo.FileName} process with Id={_process.Id} started"); _process.BeginErrorReadLine(); _process.BeginOutputReadLine(); // Register process only after it starts _processRegistry?.Register(_process); return(Task.CompletedTask); } catch (Exception ex) { _workerProcessLogger.LogError(ex, "Failed to start Language Worker Channel for language :{_runtime}", _runtime); return(Task.FromException(ex)); } }
public Process StartProcess() { try { _process.ErrorDataReceived += (sender, e) => OnErrorDataReceived(sender, e); _process.OutputDataReceived += (sender, e) => OnOutputDataReceived(sender, e); _process.Exited += (sender, e) => OnProcessExited(sender, e); _process.EnableRaisingEvents = true; _workerProcessLogger?.LogInformation($"Starting language worker process:{_process.StartInfo.FileName} {_process.StartInfo.Arguments}"); _process.Start(); _workerProcessLogger?.LogInformation($"{_process.StartInfo.FileName} process with Id={_process.Id} started"); _process.BeginErrorReadLine(); _process.BeginOutputReadLine(); // Register process only after it starts _processRegistry?.Register(_process); } catch (Exception ex) { throw new HostInitializationException($"Failed to start Language Worker Channel for language :{_runtime}", ex); } return(_process); }
// send capabilities to worker, wait for WorkerInitResponse internal void InitWorker(RpcEvent startEvent) { _processRegistry?.Register(_process); _inboundWorkerEvents.Where(msg => msg.MessageType == MsgType.WorkerInitResponse) .Timeout(timeoutInit) .Take(1) .Subscribe(WorkerReady, HandleWorkerError); Send(new StreamingMessage { WorkerInitRequest = new WorkerInitRequest() { HostVersion = ScriptHost.Version } }); }
// start worker process and wait for an rpc start stream response internal void StartWorker() { _startSubscription = _inboundWorkerEvents.Where(msg => msg.MessageType == MsgType.StartStream) .Timeout(processStartTimeout) .Take(1) .Subscribe(InitWorker, HandleWorkerError); var workerContext = new WorkerCreateContext() { RequestId = Guid.NewGuid().ToString(), MaxMessageLength = _scriptConfig.MaxMessageLengthBytes, WorkerId = _workerId, Arguments = _workerConfig.Arguments, WorkingDirectory = _scriptConfig.RootScriptPath, ServerUri = _serverUri, }; _process = _processFactory.CreateWorkerProcess(workerContext); StartProcess(); _processRegistry?.Register(_process); }