我试图通过推出一个program2完成工作的控制台应用程序来执行并行处理.它启动时program1知道要启动多少个实例.
在某些时候,程序无法启动更多实例.即使你增加了instancesmount它,它也只会发挥到极限.在这种情况下只有92.如果我将限制设置为100或200,它仍然只在服务器上启动92.
我在c#中编写程序,它在Windows Server 2008中运行.
这是代码:
for (int instanceCount = 0; instanceCount < InstancesAmount; instanceCount++)
{
using (System.Diagnostics.Process myProcess = new System.Diagnostics.Process())
{
if (hiddeConsoleWindow)
{
myProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
}
myProcess.StartInfo.FileName = ExecutablePathProgram2;
System.Security.SecureString password = new System.Security.SecureString();
foreach (char c in ConfigurationSettingsManager.ProcessStartPassword.ToCharArray())
{
password.AppendChar(c);
}
myProcess.StartInfo.UserName = ConfigurationSettingsManager.ProcessStartUserName;
myProcess.StartInfo.Password = password;
myProcess.StartInfo.Domain = ConfigurationSettingsManager.ProcessStartDomain;
myProcess.StartInfo.UseShellExecute = false;
myProcess.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找是否有最大的实例要启动,但它总是说它与操作系统支持的一样多.
我还检查了每个会话或每个用户是否有最大实例,但找不到任何描述类似内容的内容,或者我确实错过了它.
引用Raymond Chen的博客:"如果你不得不询问各种操作系统限制,你可能做错了什么".
即使有很多流程,计算机实际可以完成多少工作也是有限的.通过确定系统中的处理器数量并选择要执行的许多并发任务,您将获得更好的服务.然后,您的"program1"可以启动该进程并使用StartInfo来监视进程何时结束(同时通过重定向输出和错误流并根据需要记录它们来捕获任何错误输出.一旦进程完成,那么您应该启动队列中的下一个.
当你启动那么多进程时,系统会试图在100个进程之间切换上下文,并且不会做任何事情.
您可能会遇到内存限制,具体取决于您的子进程分配的内存量.你将有一堆进程启动并占用大块内存,但在处理器出现之前无所事事.如果它无法分配内存,它可能会阻塞并终止进程(取决于如何完成错误处理).
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |