什么是最推荐的.NET自定义线程池,它可以有单独的实例,即每个应用程序有多个线程池?我需要一个无限的队列大小(构建一个爬虫),并且需要为我正在抓取的每个站点并行运行一个单独的线程池.
编辑:我需要尽可能快地挖掘这些网站以获取信息,为每个站点使用单独的线程池将使我能够控制在任何给定时间在每个站点上工作的线程数.(不超过2-3)
谢谢罗伊
我正在研究任务并行库,我在某处读到TPL实际上使用了CLR-Level的线程池机制.我找不到任何确认此信息的文章.我知道,TPL为每个线程都有任务队列,并使用一些特殊的工作窃取算法进行平衡.据我所知,它为每个处理器创建一个线程.自.NET 4以来,线程池开始使用TPL的任务对象.
我无法理解TPL如何使用线程池.线程池模式状态,工作项排队,线程池中的空闲线程从此队列中获取一个.然而,TPL将项目(任务)存储到线程队列中,并且如果需要的话,工作窃取工作......因此,完全不同.我的错误在哪里?
额外的问题:由于这是我的第一个Stack Overflow问题,我不确定它是否合适.是吗?
我正在用C编写一个简单的网络服务器,用于我正在做的课程.一个要求是我们实现一个线程池来处理使用pthreads的连接.
我知道我将如何大致这样做(在主线程中调用accept并将文件描述符传递给freee线程),但是我的朋友提出了一种替代方法,而不是我想到的方法:在前面创建我的所有线程,并让他们全部循环接听电话.接受的想法是阻止所有空闲线程,当连接进入时,只给出一个文件描述符.然后当一个给定的线程完成一个连接时,它会循环回来并阻塞一个调用再次接受.使用accept()作为信号量的调用.这样可以简化其实现的实现,因为您不需要跟踪哪些线程正忙,哪些线程已准备好进行连接.理论上它也可能是较低的延迟,因为线程可以立即开始执行.
我的问题是,这样安全吗?我打算实施它并尝试一下,但我还没准备好,我很想知道答案.我在谷歌和这里搜索stackoverflow,但找不到任何人这样做.接受线程安全吗?我假设这种方法会有更多的开销,因为你一直在运行所有的线程,这两种方法只是简单的内存/延迟权衡吗?
编辑:我不确定这应该是社区维基,如果它应该是道歉,我找不到按钮:P
线程池线程完成后,Name或线程本地数据之类的东西会被重置吗?那么当线程下次出现在游泳池中时,它就像全新的一样?
是否有关于ThreadPool线程这方面的"官方"文档?
我真的不认为自己是java或tomcat专家.我有一个运行tomcat的vps.在tomcat.conf文件中有以下内容.
请注意,注释掉了Excecutor 'tomcatThreadPool'相应的Connector引用Executor.
冒着听起来非常愚蠢的风险......我会问这个问题......
随着Executor和Connector注释,我的servlet如何运作?换句话说,他们是否使用默认线程池?或者我应该取消注释Executor和Connectorservlet的效率?
我想我在这个领域根本不是很了解......
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用ScheduledExecutorService.我需要在某个Utility类中不时使用它来运行计划的线程.
在静态字段中保存ScheduledExecutorService是一个好的设计吗?在这种情况下是否必须调用ScheduledExecutorService.shutdown()?如果我不调用关机会有什么风险?
这就是我的想法:
private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5);
public void scheduleTask(String name) {
Future<?> future = futuresMapping.get(name);
if(future!=null && !future.isDone())
future.cancel(true);
//execute once
Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES);
futuresMapping.put(name, f);
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我已经知道了这个问题的答案,但是希望与社区分享,因为它没有来自Microsoft的文档.
场景:流量激增会攻击您的IIS 7.5 ASP.NET网站,并且您会注意到请求开始排队.网站的性能慢下来,但你有足够的CPU和RAM可用.
这是我们最近看到的一个网站,它产生了大量的内部网络服务调用.内部运行状况检查将开始超时,这将导致此服务器退出群集.(但是,这台服务器是最强大的硬件......)
ThreadLocal执行期间存储在存储中的内容是否会在线程返回ThreadPool时自动清除(如预期的那样)?
在我的应用程序中,我ThreadLocal在一些执行期间放入一些数据,但如果下次使用相同的Thread,那么我在ThreadLocal存储中找到过时的数据.
我希望我的程序在下面的行之后等待
frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
Run Code Online (Sandbox Code Playgroud)
如上所述方法是通过StartProcessWithProgress()方法在内部调用线程.我希望在执行代码逻辑-2行之前完成该线程.同时,它不应该停止由frmProgressBar.UpdateProgress()完成的UI更新.我该怎么做呢?
namespace NS1
{
public partial class frmMain : Form
{
private void button1_Click(object sender, EventArgs e)
{
frmProgressBar frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
//code logic - 2
MessageBox.Show("This is executing immediately.
I want to wait until above thread is complete");
}
}
public partial class frmProgressBar : Form
{
public void UpdateProgress(String strTextToDisplayOnProgress)
{
progressBar1.BeginInvoke(
new Action(() =>
{
progressBar1.Value++;
lblFileName.Text = strTextToDisplayOnProgress;
if (progressBar1.Value == progressBar1.Maximum)
{
this.Hide();
}
}));
}
public delegate void …Run Code Online (Sandbox Code Playgroud) 我试图找出如何在Java 8并行流中复制ThreadLocal值.
所以如果我们考虑这个:
public class ThreadLocalTest {
public static void main(String[] args) {
ThreadContext.set("MAIN");
System.out.printf("Main Thread: %s\n", ThreadContext.get());
IntStream.range(0,8).boxed().parallel().forEach(n -> {
System.out.printf("Parallel Consumer - %d: %s\n", n, ThreadContext.get());
});
}
private static class ThreadContext {
private static ThreadLocal<String> val = ThreadLocal.withInitial(() -> "empty");
public ThreadContext() {
}
public static String get() {
return val.get();
}
public static void set(String x) {
ThreadContext.val.set(x);
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个输出
Main Thread: MAIN
Parallel Consumer - 5: MAIN
Parallel Consumer - 4: MAIN
Parallel …Run Code Online (Sandbox Code Playgroud) threadpool ×10
java ×4
.net ×3
c# ×2
asp.net ×1
c ×1
forkjoinpool ×1
iis ×1
java-8 ×1
performance ×1
pthreads ×1
servlets ×1
sockets ×1
task ×1
thread-local ×1
tomcat ×1
web-crawler ×1