Spring.NET 프레임 워크를 사용하여 WCF 서비스를 만듭니다. 이 서비스는 수학 서비스 이며 클라이언트 응용 프로그램에 대한 계산을 제공합니다.WCF의 병렬 처리
멀티 코어 서버에서 WCF 서비스 병렬 처리에 대한 질문이 있습니다. 간단한 예를 들어 나는 20 개의 코어를 가진 서버를 가지고있다.
먼저 여기에 간단한 코드가 나와 있습니다.
//WS interface
public interface IMatlabService
{
List<ResultData> Calculate(byte [] data);
}
//WS class definition
[ServiceBehavior(Namespace = "http://server.com/MatlabService")]
public class MatlabService: IMatlabService
{
public IMatlabManager MatlabManager{get;set:}
//web metod for math computations
public List<ResultData> Calculate(byte [] data)
{
var result = new List<ResultData>();
//do math work in another thread
Task<List<ResultData>> task = Task.Factory.StartNew<List<ResultData>>(() =>
{
return MatlabManager.CalculateWithFiniteElementMethod(data);
});
result.AddRange(task.Result)
return result;
}
}
public interface IMatlabManager
{
List<ResultData> CalculateWithFiniteElementMethod(byte [] data);
}
public class MatlabManager : IMatlabManager
{
public List<ResultData> CalculateWithFiniteElementMethod(byte [] data)
{
// do some math work
}
}
Spring.NET에서는 웹 서비스 및 관리자 클래스를 싱글 톤이 아닌 구성합니다.
Spring.NET XML 구성은 여기입니다.
matlab에 관리 프로그램 구성 :
<object name="matlabManager"
type="MatlabManager"
singleton="false"/>
MatlabService 구성 :
<behavior name="Behavior1">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
<services>
<service name="matlabService"
behaviorConfiguration="Behavior1">
<endpoint address=""
binding="basicHttpBinding"
contract="IMatlabService"
bindingNamespace="http://server.com/MatlabService"/>
<endpoint contract="IMetadataExchange"
binding="mexHttpBinding"
address="mex"/>
</service>
</services>
SVC 파일의 web.config에서
<object name="matlabService"
type="MatlabService"
singleton="false">
<property name="MatlabManager" ref="matlabManager"/>
</object>
WCF 서비스 구성. 나는 각 클라이언트의 웹 metod 호출에 대해 생각
-
는 MatlabService의 새로운 인스턴스를 생성하고 WCF 서비스 작업은 CPU 코어에이 스레드를 할당 새 스레드 (WCF 서비스 스레드)와 OS에서 할 수 있습니다.<%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>
또는 잘못된 동작으로 호출 당 새로운 서비스 개체를 만듭니다. ServiceBehavior 속성 InstanceContextMode에서 을 정의해야합니까?
[인 ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)] 수학 작업 다른 스레드 (수학 스레드)를 수행한다 그래서 병렬화 System.Threading.Tasks를 사용 MatlabService의 계산 웹 방법에
.
각 호출마다 WCF 서비스 스레드가 만들어지고 WCF 서비스에서 스레드가 만들어집니다.
사실인지 확실하지 않습니다.
WCF 서비스에서 멀티 스레딩을 허용해야 할 수도 있습니다. ConcurrencyMode?
[인 ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall, 들면, ConcurrencyMode = ConcurrencyMode.Multiple)]
내가 멀티 코어 CPU를 요구 metod 웹을 병렬화 할 수있는 방법의 아이디어를 듣고 좋아할
. Google을 사용하지만 스프링을 사용하기 때문에 Google에 알기 쉽고 유용하지 않습니다.WCF 서비스 생성을위한 .NET 프레임 워크.