3

私のイメージング ライブラリには、プロセッサのリストを利用して、HttpModule.

現在、メモリのオーバーヘッドを抑えるために作成された各プロセッサのインスタンスは 1 つだけであり、これらの各プロセッサには書き込み可能なプロパティがあり、一致した各クエリ文字列パラメーターを処理する順序を決定し、解析された値を保存して処理するのに役立ちます。

ご覧のとおり、現在、メソッド機能をlockステートメント内にラップして、異なるスレッドHttpModuleがプロセッサのプロパティを上書きしないようにしていますが、これがボトルネックになる可能性があることはわかっています。私が疑問に思っているのは、ロックなしでプロセッサをスレッドセーフにする設計パターンまたは方法はありますか?

public static ImageFactory AutoProcess(this ImageFactory factory)
{
    if (factory.ShouldProcess)
    {
        // TODO: This is going to be a bottleneck for speed. Find a faster way.
        lock (SyncLock)
        {
            // Get a list of all graphics processors that 
            // have parsed and matched the querystring.
            List<IGraphicsProcessor> list =
              ImageProcessorConfig.Instance.GraphicsProcessors
              .Where(x => x.MatchRegexIndex(factory.QueryString) != int.MaxValue)
              .OrderBy(y => y.SortOrder)
              .ToList();

            // Loop through and process the image.
            foreach (IGraphicsProcessor graphicsProcessor in list)
            {
                factory.Image = graphicsProcessor.ProcessImage(factory);
            }
        }
    }

    return factory;

}
4

2 に答える 2

2

プロデューサー コンシューマー キューに興味があるかもしれません。非常に一般的には、イベント (プロデューサー) を受け取り、それらを(コンシューマー) のHttpModule1 つ以上のインスタンスにキューに入れます。IGraphicsProcessor

これは、標準的で最も単純なプロデューサー/コンシューマー キューの実装です: http://www.albahari.com/threading/part4.aspx#_Wait_Pulse_Producer_Consumer_Queue

ロックをなくしたい場合はSystem.Collections.Concurrent.ConcurrentQueue<T>、.NET 4.0 などのロック フリー キューの実装を使用してプロデューサー/コンシューマー キューを試す必要があります。

于 2013-03-04T23:46:07.090 に答える
2

複数のプロセッサを使用しないことでメモリの負荷を抑える必要がある (そして、少なくとも特定のプロセッサが現在の作業を完了できるようにする必要がある) か、完全な同時実行性が必要です。

明確な理由がない限り、各イメージ プロセッサの複数のインスタンスを許可します。GC が最適に機能できるように、プロセッサが処理対象のデータへの参照をできるだけ早く解放するようにします。これには、単純さと CPU コアの有効活用という利点があります。

各プロセッサのインスタンスを 1 つだけ許可する明確な理由がある場合は、すべてのプロセッサが作業を完了するまでロックするという現在の状況を回避することで、コードを改善できます。代わりに、現在のアイテムが完了したら、次のアイテムで作業する必要がある各プロセッサを要求するメカニズムを持つことができます。プロデューサー/コンシューマーパターンを使用するという@anthonyの提案は、それに対する確かな解決策のようです。このアプローチでは、個々のフィルターのスループットで依然としてボトルネックが発生し、すべての CPU コアを最適に活用できない可能性があることに注意してください。

于 2013-03-04T23:47:13.450 に答える