mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Run extension harvesting code in parallel task
Extension harvesting is a mix of independent operations requiring file i/o and cpu usage, so they are good candidate for parellelization. Also make module harvesting in ~/Core a separate folder instance. --HG-- branch : 1.x
This commit is contained in:
@@ -41,11 +41,16 @@ namespace Orchard.Environment.Extensions {
|
||||
}
|
||||
|
||||
public IEnumerable<ExtensionDescriptor> AvailableExtensions() {
|
||||
return _folders.SelectMany(folder => folder.AvailableExtensions());
|
||||
return _cacheManager.Get("AvailableExtensions", ctx =>
|
||||
_folders
|
||||
.AsParallel() // Execute in parallel for each folder
|
||||
.SelectMany(folder => folder.AvailableExtensions())
|
||||
.ToList() // Force execution inside the cache entry
|
||||
);
|
||||
}
|
||||
|
||||
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
|
||||
return _cacheManager.Get("...", ctx =>
|
||||
return _cacheManager.Get("AvailableFeatures", ctx =>
|
||||
AvailableExtensions().SelectMany(ext => ext.Features).OrderByDependenciesAndPriorities(HasDependency, GetPriority).ToReadOnlyCollection());
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
|
||||
namespace Orchard.Environment.Extensions.Folders {
|
||||
public class CoreModuleFolders : IExtensionFolders {
|
||||
private readonly IEnumerable<string> _paths;
|
||||
private readonly IExtensionHarvester _extensionHarvester;
|
||||
|
||||
public CoreModuleFolders(IEnumerable<string> paths, IExtensionHarvester extensionHarvester) {
|
||||
_paths = paths;
|
||||
_extensionHarvester = extensionHarvester;
|
||||
}
|
||||
|
||||
public IEnumerable<ExtensionDescriptor> AvailableExtensions() {
|
||||
return _extensionHarvester.HarvestExtensions(_paths, DefaultExtensionTypes.Module, "Module.txt", false/*isManifestOptional*/);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,9 @@ namespace Orchard.Environment {
|
||||
{
|
||||
builder.RegisterType<ExtensionHarvester>().As<IExtensionHarvester>().SingleInstance();
|
||||
builder.RegisterType<ModuleFolders>().As<IExtensionFolders>().SingleInstance()
|
||||
.WithParameter(new NamedParameter("paths", new[] { "~/Core", "~/Modules" }));
|
||||
.WithParameter(new NamedParameter("paths", new[] { "~/Modules" }));
|
||||
builder.RegisterType<CoreModuleFolders>().As<IExtensionFolders>().SingleInstance()
|
||||
.WithParameter(new NamedParameter("paths", new[] { "~/Core" }));
|
||||
builder.RegisterType<ThemeFolders>().As<IExtensionFolders>().SingleInstance()
|
||||
.WithParameter(new NamedParameter("paths", new[] { "~/Themes" }));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user