标签: threadpool

运行Web服务请求的线程池的合理线程数

在Java中创建FixedThreadPool Executor对象时,您需要传递一个参数,该参数描述Executor可以并发执行的线程数.我正在建立一个服务类,负责处理大量的电话号码.对于每个电话号码,我需要执行Web服务(这是我的瓶颈),然后在hashmap中保存响应.

为了使这个瓶颈对我的服务性能的危害减少,我决定创建一个Worker类来获取未处理的元素并处理它们.Worker类实现了Runnable接口,我使用Executor运行Workers.

可以在同一时间运行的Worker数量取决于Executor FixedThreadPool的大小.ThreadPool的安全大小是多少?当我用一些大数字作为参数创建FixedTheradPool时会发生什么?

java concurrency web-services threadpool

17
推荐指数
2
解决办法
9258
查看次数

Java线程池/执行器服务和wait() - 线程和任务队列会发生什么?

我环顾四周但没有找到答案,所以我想确认一下.

假设我有一个固定大小的线程池 - ExecutorService pool = Executors.newFixedThreadPool(5);

我有一些代码:

pool.execute(new Runnable(){
    try{
        Object waitForMe = doSomethingAndGetObjectToWaitFor();
        waitForMe.wait();
        doSomethingElse();
    }catch(Exception e){ throw new RunTimeException(e) } 

});
Run Code Online (Sandbox Code Playgroud)

让我们假设上面的代码被称为几百次.池中只有5个线程(因此上述语句中只有5个应该在一个点上存在).还假设wait()在一个对象上对一个thrid方做了一些I/O调用,并在操作完成时等待回调,所以它自然需要一段时间才能完成.

现在我的问题是当其中一个任务到达a时的行为是什么wait(),任务是否进入休眠状态,然后线程池中的线程从队列中取出另一个任务并开始运行它?

如果正在等待的任务进入睡眠状态,当它获得notify()并唤醒时会发生什么?线程是否返回到线程池的队列(前面或后面)并等待,直到5个线程中的一个可以继续执行它(即调用doSomethingelse())?或者正在执行它的线程是否也进入休眠状态,即5个执行程序线程中的一个正在等待任务(这是我假设的)?或者执行程序线程是否接受另一个任务,并在第一个任务从wait()返回时被中断?

java concurrency multithreading executorservice threadpool

17
推荐指数
1
解决办法
1万
查看次数

处理异常的Python线程池

我一直在寻找一个简单的python线程池模式的良好实现,真的找不到任何适合我的需求.我正在使用python 2.7,我发现的所有模块都不起作用,或者没有正确处理工作程序中的异常.我想知道是否有人知道可以提供我正在搜索的功能类型的库.非常感谢.

我的第一次尝试是使用内置multiprocessing模块,但由于这不使用线程而是使用子进程,而是遇到了无法对对象进行pickle的问题.不要去这里

from multiprocessing import Pool

class Sample(object):
    def compute_fib(self, n):
        phi = (1 + 5**0.5) / 2
        self.fib = int(round((phi**n - (1-phi)**n) / 5**0.5))

samples = [Sample() for i in range(8)]
pool = Pool(processes=8)
for s in samples: pool.apply_async(s.compute_fib, [20])
pool.join()
for s in samples: print s.fib

# PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)

期货

所以,我看到有一些的蟒蛇3.2凉爽的并发功能回到端口这里.这似乎完美且易于使用.问题是,当你在一个工人一个例外,你只能得到异常的类型,比如"ZeroDivisionError",但没有回溯,因此没有迹象表明其中线导致异常.代码变得无法调试.不行.

from concurrent import futures

class Sample(object):
    def compute_fib(self, n):
        phi = (1 + 5**0.5) …
Run Code Online (Sandbox Code Playgroud)

python multithreading exception-handling threadpool

17
推荐指数
1
解决办法
1万
查看次数

我怎么知道我已达到Node中定义的线程限制?

我已将线程池的大小限制为25.

process.env.UV_THREADPOOL_SIZE = 25;
Run Code Online (Sandbox Code Playgroud)

如何知道所有线程在运行时都已耗尽?

有没有办法发现在新请求期间所有定义线程都已耗尽?

我正在使用Native Abstractions for Node.js(NAN)来调用C++函数.对于C++的每个请求都创建了Nan :: AsyncQueueWorker.在这里,我想查找线程限制是否已用尽,然后添加安全系数.

javascript multithreading threadpool node.js c++11

17
推荐指数
1
解决办法
556
查看次数

在Threads中访问作用域代理bean

我有一个在tomcat中运行的Web应用程序,我正在使用ThreadPool(Java 5 ExecutorService)并行运行IO密集型操作以提高性能.我想让每个池化线程中使用的一些bean都在请求范围内,但ThreadPool中的Threads无法访问spring上下文并获得代理失败.关于如何为ThreadPool中的线程提供弹簧上下文以解决代理失败的任何想法?

我猜测必须有一种方法来注册/取消注册ThreadPool中的每个线程,每个任务使用spring,但是没有任何运气找到如何做到这一点.

谢谢!

java spring spring-mvc threadpool

16
推荐指数
2
解决办法
9712
查看次数

使用boost创建线程池

是否可以使用boost的线程创建线程池?我正在寻找所有的升级库,我找不到线程池管理器(或类似的东西)......有没有办法做到这一点?

TNX!

c++ boost boost-thread threadpool

16
推荐指数
2
解决办法
2万
查看次数

如何创建LIFO执行器?

我想创建一个线程池,它将执行最近提交的任务.关于如何实现这一目标的任何建议?

谢谢

java multithreading threadpool

16
推荐指数
2
解决办法
5810
查看次数

如何解释Java线程堆栈?

符合这个问题:如何获得线程的堆栈跟踪

我想知道是否有人可以指出有关解释提取的Java线程堆栈的信息jstack.

我的情况是我有一个在GlassFish v2.1.1上运行的Java EE 5应用程序,它定期挂起(每天至少2-3次).要让它再次运行,我必须杀死Glassfish进程并再次启动域.应用程序通常会变得越来越慢,直到它最终完全挂起.一旦挂起,我就无法获得线程堆栈.我已经能够获得一个线程堆栈,因为它越来越慢,但我看不到找到问题或挂起的线程.

这是最新的线程转储:http://issues.i2m.dk/attachments/66/threadstack.201103211046.txt

线程转储片段:

"p: thread-pool-1; w: 20" daemon prio=10 tid=0x00007efd18843800 nid=0x5f89 in Object.wait() [0x00007efd03381000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00007efd480fc228> (a com.sun.corba.ee.impl.orbutil.threadpool.WorkQueueImpl)
    at com.sun.corba.ee.impl.orbutil.threadpool.WorkQueueImpl.requestWork(WorkQueueImpl.java:171)
    - locked <0x00007efd480fc228> (a com.sun.corba.ee.impl.orbutil.threadpool.WorkQueueImpl)
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:528)

"TP-Processor83" daemon prio=10 tid=0x0000000043179000 nid=0x5f87 runnable [0x00007efd03583000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    - locked <0x00007efe72696090> (a java.io.BufferedInputStream)
    at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:607)
    at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:545)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:672)
    at …
Run Code Online (Sandbox Code Playgroud)

java debugging multithreading glassfish threadpool

16
推荐指数
1
解决办法
4万
查看次数

将给定ID的任务绑定到同一线程的线程池

是否存在线程池(在Java中)的任何实现,以确保在同一线程上执行相同逻辑ID的所有任务?

我所追求的逻辑是,如果在给定逻辑ID的特定线程上已经执行了任务,则在同一线程上安排具有相同ID的新任务.如果没有线程为同一ID执行任务,则可以使用任何线程.

这将允许并行执行不相关ID的任务,但是同一ID的任务将以串行和提交的顺序执行.

如果没有,是否有任何关于如何扩展ThreadPoolExecutor以获得此行为的建议(如果可能的话)?

UPDATE

花了更长时间考虑这个问题,我实际上并不要求在同一个线程上执行相同逻辑ID的任务,只是它们不会同时执行.

这方面的一个例子是处理客户订单的系统,可以同时处理多个订单,但不能同一个客户(并且必须按顺序处理同一客户的所有订单).

我现在采用的方法是使用标准的ThreadPoolExecutor,自定义BlockingQueueRunnable使用自定义包装器进行包装.的Runnable包装器逻辑是:

  1. 以原子方式尝试将ID添加到并发"running"set(ConcurrentHashMap)以查看当前是否正在运行相同ID的任务
    • 如果添加失败,请将任务重新推送到队列的前面并立即返回
    • 如果成功,继续
  2. 运行任务
  3. 从"正在运行"的集合中删除任务的关联ID

然后,队列的poll()方法只返回具有当前不在"运行"集中的ID的任务.

这样做的问题在于,我确信会有很多我没有想过的极端情况,因此需要进行大量的测试.

java multithreading threadpool

16
推荐指数
2
解决办法
3561
查看次数

执行程序优于新线程的优点

在Java程序中使用Executors而不仅仅是Threads有什么好处.

ExecutorService pool = Executors.newFixedThreadPool(2);
void someMethod() {
    //Thread
    new Thread(new SomeRunnable()).start();

    //vs

    //Executor
    pool.execute(new SomeRunnable());
}
Run Code Online (Sandbox Code Playgroud)

执行程序是否仅限制允许一次运行的线程数(线程池)?它是否实际上将runnable复用到它创建的线程上?如果不是,它只是一种避免每次都必须编写新的Thread(runnable).start()的方法吗?

java multithreading executorservice threadpool

16
推荐指数
2
解决办法
5656
查看次数