コード例 #1
0
ファイル: TaskProcess.cs プロジェクト: supcry/Plex
 public TaskProcess(string nodeName, string taskName, Connection masterConnect,
     string workDir, Dictionary<string, ulong> mainFileList,
     bool haltOnException, int maxThreadsCount)
 {
     _nodeName = nodeName;
     _taskName = taskName;
     _masterConnect = masterConnect;
     _storage = new FileStorage(workDir, taskName, masterConnect);
     _mainFileList = mainFileList;
     _haltOnException = haltOnException;
     _maxThreadsCount = maxThreadsCount;
     _status = NodeTaskStatus.Unknown;
 }
コード例 #2
0
ファイル: MasterNode.cs プロジェクト: supcry/Plex
 public void Event(string taskName, string nodeName, NodeTaskStatus status)
 {
     _tasks[taskName].Event(nodeName, status);
 }
コード例 #3
0
ファイル: NodeTaskData.cs プロジェクト: supcry/Plex
 public void Event(NodeTaskStatus status)
 {
     LastActiveDate = DateTime.Now;
     Status = status;
 }
コード例 #4
0
ファイル: TaskScheduler.cs プロジェクト: supcry/Plex
 //oneway
 public void Event(string nodeName, NodeTaskStatus status)
 {
     _inProgress[nodeName].Event(status);
     _schedulerLocker.Set();
 }
コード例 #5
0
ファイル: TaskProcess.cs プロジェクト: supcry/Plex
 public void Dispose()
 {
     Stop();
     if (_execDomain.HasValue)
     {
         try
         {
             _execDomain.Value.Value.CleanUp();
         }catch{}
         AppDomain.Unload(_execDomain.Value.Key);
         _execDomain = null;
     }
     _keys.Clear();
     _results.Clear();
     _subTasks.Clear();
     _storage.Clear();
     _schedulerLocker.Close();
     _status = NodeTaskStatus.Halt;
 }
コード例 #6
0
ファイル: TaskProcess.cs プロジェクト: supcry/Plex
        private void SchedulerThread()
        {
            try
            {
                while (_schedulerLocker.WaitOne())
                {
                    if (!_isStarted)
                        return;

                    if (_keys.Count != 0)
                    {
                        Trace.TraceInformation("Рабочая нода " + _nodeName + " начала  " + _keys.Count + " подзадач для задачи " + _taskName);
                        _status = NodeTaskStatus.Working;
                        // выполним все имеющиеся подзадачи
                        if(_maxThreadsCount>1)
                            Parallel.ForEach(_keys.DequeueRange(), new ParallelOptions{MaxDegreeOfParallelism = _maxThreadsCount}, SchedulerTaskExecute);
                        else
                            foreach (var key in _keys.DequeueRange())
                                SchedulerTaskExecute(key);
                        if (!_isStarted)
                            return;

                        Trace.TraceInformation("Рабочая нода " + _nodeName + " закончила обработку подзадач. Осталось " + _keys.Count + " штук");
                        // вернём результаты руту
                        if (_keys.Count == 0)
                        {
                            Trace.TraceInformation("Рабочая нода " + _nodeName + " посылает сообщение о завершении работы над всем переданными подзадачами");
                            _status = NodeTaskStatus.Complete;
                            SendStatus();
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
                Trace.TraceError("SchedulerThread: shutting down by user");
            }
            catch (Exception ex)
            {
                Trace.TraceError("SchedulerThread.CriticalError: " + ex);
                Stop();
            }
        }
コード例 #7
0
ファイル: TaskProcess.cs プロジェクト: supcry/Plex
 private void Init()
 {
     _status = NodeTaskStatus.Initing;
     _storage.Precache(_mainFileList);
     _execDomain = null;
     _status = NodeTaskStatus.Ready;
     _execDomain = ExecProxy.StartDomain(_storage.WorkDir, _taskName, null, _mainFileList.Keys);
     _mainFileList.Clear();
 }
コード例 #8
0
ファイル: TaskProcess.cs プロジェクト: supcry/Plex
        public void Stop()
        {
            // Остановим текущие подзадачи. Вернём их в очередь.
            lock (this)
            {
                _status = NodeTaskStatus.Stop;
                _isStarted = false;
                if (Thread.CurrentThread != _schedulerThread)
                {
                    if (_schedulerThread != null && _schedulerThread.IsAlive)
                    {
                        _schedulerLocker.Set();
                        Thread.Sleep(100);
                        if (_schedulerThread.IsAlive)
                            _schedulerThread.Abort();
                    }

                }
                //_schedulerThread = null;

                foreach (var kst in _subTasks)
                {
                    kst.Value.Thread.Abort();
                    _keys.Enqueue(kst.Key);
                }
                _subTasks.Clear();
                SendStatus();
            }
        }
コード例 #9
0
ファイル: TaskProcess.cs プロジェクト: supcry/Plex
 public void Start()
 {
     if (_isStarted)
         return;
     lock(this)
     {
         if (_isStarted)
             return;
         if (_mainFileList.Count > 0)
             Init();
         _schedulerThread = new Thread(SchedulerThread) {Name = "scheduletThread." + _taskName};
         _schedulerLocker.Set();
         _isStarted = true;
         _schedulerThread.Start();
         _status = NodeTaskStatus.Ready;
         SendStatus();
     }
 }
コード例 #10
0
ファイル: TaskProcess.cs プロジェクト: supcry/Plex
 public SubTaskResult[] ReturnCompletedResults()
 {
     var ret = _results.DequeueRange(Constants.MaxWCFArrayLength).ToArray();
     if(_status == NodeTaskStatus.Complete)
         _status = NodeTaskStatus.Ready;
     #if DEBUG
     foreach (var r1 in ret)
     {
         if (r1 == null)
             throw new Exception("logic error!");
     }
     #endif
     return ret;
 }