如何解决线程无一例外地被杀死 更新
我得到 cItems
,它是由 Selenium 提供的 IReadOnlyCollection<IWebElement>
。
然而。我使函数基于单线程,效果很好。但现在我想提高性能,所以我选择了 .Net ThreadPool。
ThreadPool.SetMaxThreads(16,16);
IEnumerator<IWebElement> iter = cItems.GetEnumerator();
while(iter.MoveNext()) {
cThreadJobObj.Item = iter.Current;
ThreadPool.QueueUserWorkItem(new WaitCallback(GetThreadJob),cThreadJobObj.Clone()); // .Clone() is a deep clone
}
现在的问题是,线程在第 5 行消失了。没有抛出任何异常,我想是因为没有调用 } catch (Exception Ex) {
块。
public static void GetThreadJob(object ThreadJob) {
try {
var cThreadJob = ThreadJob as ThreadJobObj;
var IWebElement = cThreadJob.Item;
var cElem = cItem.FindElement(By.CssSelector("span.im_message_date_text"));
} catch (Exception Ex) {
Rupert.Logger.E("{Thread.GetCurrentProcessorId()} on Obj {cThreadJob.iCount}",Ex,false);
}
}
GetThreadJob
被所有 16 个线程调用,并且都消失在同一行。
更新
我将行分开,线程在此方法 ISearchContext.FindElement Method
中消失。
IWebElement.FindElement(By)
如果我在这条线上快速观看,这就是价值:
cItem.FindElement(cSel) Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation. OpenQA.Selenium.IWebElement
解决方法
好的,经过漫长的一夜,我发现 .Net 在 Selenium 进程中限制了可以打开的套接字。
ServicePointManager.DefaultConnectionLimit
的默认值为 2,Asp.net
的默认值为 10。 More Info
这可以通过在脚本的初始化中避免:
ThreadPool.SetMinThreads(Environment.ProcessorCount / 2,25);
ThreadPool.SetMaxThreads(Environment.ProcessorCount * 4,100);
ServicePointManager.UseNagleAlgorithm = true;
ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 65000;
ServicePointManager.MaxServicePointIdleTime = 500;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。