private void Dequeue(K key, ParallelQueueUnit q, int count) { V[] vals = new V[count]; for (int i = 0; i < count; i++) { V item = q.Queue.Dequeue(); vals[i] = item; } _perfCounters.DequeueTotal.Increment(); _perfCounters.DequeuePerSecond.Increment(); _perfCounters.DequeueConcurrent.Increment(); ThreadPool.QueueUserWorkItem(new WaitCallback( delegate { try { _dequeueAction(key, vals); } catch (Exception ex) { _tracing.Error(ex, "ParallelQueue DequeueAction Failed"); _perfCounters.DequeueFailed.Increment(); } finally { _perfCounters.DequeueConcurrent.Decrement(); } } ) ); }
public void FlushCache() { lock (_syncRoot) { foreach (KeyValuePair <K, ParallelQueueUnit> p in _queues) { ParallelQueueUnit queue = p.Value; while (queue.Queue.Count > 0) { int queueCount = queue.Queue.Count; int dequeueCount = queueCount > _maxBatchCount ? _maxBatchCount : queueCount; Dequeue(p.Key, queue, dequeueCount); } } } }
/// <summary> /// flush 特定key 的 queue /// </summary> /// <param name="key"></param> public void FlushCacheByKey(K key) { lock (_syncRoot) { ParallelQueueUnit queueUnit = null; if (_queues.TryGetValue(key, out queueUnit)) { while (queueUnit.Queue.Count > 0) { int queueCount = queueUnit.Queue.Count; int dequeueCount = queueCount > _maxBatchCount ? _maxBatchCount : queueCount; Dequeue(key, queueUnit, dequeueCount); } } } }
private void ThreadProc() { while (true) { try { int nowTick = Environment.TickCount; bool idle = true; int workerThreads; int iocpThreads; ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads); // // 线程池忙时会进入保护状态 if (workerThreads < _defendWorkerThreadCounts) { idle = true; } else { lock (_syncRoot) { foreach (KeyValuePair <K, ParallelQueueUnit> p in _queues) { ParallelQueueUnit queue = p.Value; int count = GetDequeueCount(nowTick, queue); if (count > 0) { Dequeue(p.Key, queue, count); _perfCounters.QueueLength.IncrementBy(-count); idle = false; } } } } if (idle) { Thread.Sleep(1); } } catch (ThreadAbortException) { Thread.ResetAbort(); FlushCache(); return; } catch (Exception ex) { SystemLog.Error(LogEventID.ServiceFailed, ex, "Parallel<{0}> Raise Exception", _queueName); Thread.Sleep(1000); } } }
private int GetDequeueCount(int nowTick, ParallelQueueUnit q) { int queueCount = q.Queue.Count; if (queueCount >= _maxBatchCount) { return(_maxBatchCount); } else { int passedTick = nowTick - q.LastTick; if (((passedTick > _maxIdleMs) || (passedTick < -_maxIdleMs)) && queueCount > 0) { q.LastTick = nowTick; return(queueCount); } else { return(0); } } }
public void Enqueue(K queueKey, V value) { lock (_syncRoot) { ParallelQueueUnit queue; if (!_queues.TryGetValue(queueKey, out queue)) { queue = new ParallelQueueUnit(); queue.LastTick = Environment.TickCount; _queues.Add(queueKey, queue); } if (queue.Queue.Count >= MaxQueueCount) { // // Discard Queue保护自己 _perfCounters.DiscardTotal.Increment(); } queue.Queue.Enqueue(value); } _perfCounters.EnqueuePerSecond.Increment(); _perfCounters.EnqueueTotal.Increment(); _perfCounters.QueueLength.Increment(); }