标签: pool

java.lang.IllegalMonitorStateException:(m = null)无法获取监视器

为什么会这样?问题是监视器对象肯定不是null,但我们仍然经常得到这个异常:

java.lang.IllegalMonitorStateException: (m=null) Failed to get monitor for (tIdx=60)
        at java.lang.Object.wait(Object.java:474)
        at ...
Run Code Online (Sandbox Code Playgroud)

引发这种情况的代码是一个简单的池解决方案:

    public Object takeObject() {
        Object obj = internalTakeObject();
        while (obj == null) {
            try {
                available.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            obj = internalTakeObject();
        }
        return obj;
    }

    private Object internalTakeObject() {
        Object obj = null;
        synchronized (available) {
            if (available.size() > 0) {
                obj = available.keySet().iterator().next();
                available.remove(obj);
                synchronized (taken) {
                    taken.put(obj, Boolean.valueOf(true));
                }
            }
        }
        return obj;
    }

    public void returnObject(Object …
Run Code Online (Sandbox Code Playgroud)

java multithreading locking pool

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

urllib3 connectionpool - 连接池已满,丢弃连接

是否看到

urllib3.connectionpool WARNING - Connection pool is full, discarding connection
Run Code Online (Sandbox Code Playgroud)

意味着我正在有效地丢失数据(因为连接丢失)
或者这
是否意味着连接被丢弃(因为池已满);但是,当连接池可用时,稍后会重试相同的连接吗?

python connection pool urllib3

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

如何监控/记录Tomcat的线程池?

我有一个Tomcat安装,我怀疑由于线程未正确释放,线程池可能会随着时间的推移而减少.当达到maxthreads时,我在catalina.out中出现错误,但我想每五分钟将使用的线程数记录到一个文件中,这样我就可以验证这个假设.请问有谁可以建议如何做到这一点?

此外,在此安装中没有Tomcat管理器,看起来原始安装的人由于某种原因删除了管理器webapp.我不确定经理是否能够执行上述操作,或者我是否可以在不损坏现有安装的情况下重新安装它?我真正想做的就是跟踪线程池.

另外,我注意到Tomcat的maxthreads是200,但Apache的最大并发连接数较低(Apache使用mod_proxy和mod_proxy_ajp(AJP 1.3)来提供Tomcat).这似乎也错了,这些数字之间的正确关系是什么?

任何帮助非常感谢:D

更新:只是一个快速更新,说直接JMX访问工作.但是我还必须设置Dcom.sun.management.jmxremote.host.我把它设置为localhost并且它工作,但没有它没有骰子.如果其他人在尝试启用JMX时遇到类似问题,我建议您也设置此值,即使您从本地计算机进行连接也是如此.似乎某些版本的Tomcat需要它.


只是快速更新,说直接JMX访问工作.但是我还必须设置Dcom.sun.management.jmxremote.host.我把它设置为localhost并且它工作,但没有它没有骰子.如果其他人在尝试启用JMX时遇到类似问题,我建议您也设置此值,即使您从本地计算机进行连接也是如此.似乎某些版本的Tomcat需要它.

java multithreading tomcat pool ajp

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

multiprocessing.Pool()比仅使用普通函数慢

(这个问题是关于如何使多处理.Pool()更快地运行代码.我终于解决了它,最后的解决方案可以在帖子的底部找到.)

原始问题:

我正在尝试使用Python将单词与列表中的许多其他单词进行比较,并检索最相似的单词列表.为此,我使用difflib.get_close_matches函数.我使用的是Python 2.6.5相对较新且功能强大的Windows 7笔记本电脑.

我想要的是加快比较过程,因为我的比较单词列表很长,我不得不多次重复比较过程.当我听说多处理模块时,似乎合乎逻辑的是,如果比较可以分解为工作任务并同时运行(从而利用机器功率换取更快的速度),我的比较任务将更快完成.

然而,即使在尝试了许多不同的方法,并使用了文档中显示并在论坛帖子中建议的方法之后,Pool方法似乎非常慢,比在整个列表上运行原始get_close_matches函数慢得多.一旦.我想帮助理解为什么Pool()如此缓慢以及我是否正确使用它.我只使用这个字符串比较方案作为一个例子,因为这是我能想到的最新例子,我无法理解或者让多处理工作而不是反对我.下面是difflib场景中的一个示例代码,显示了普通方法和Pooled方法之间的时间差异:

from multiprocessing import Pool
import random, time, difflib

# constants
wordlist = ["".join([random.choice([letter for letter in "abcdefghijklmnopqersty"]) for lengthofword in xrange(5)]) for nrofwords in xrange(1000000)]
mainword = "hello"

# comparison function
def findclosematch(subwordlist):
    matches = difflib.get_close_matches(mainword,subwordlist,len(subwordlist),0.7)
    if matches <> []:
        return matches

# pool
print "pool method"
if __name__ == '__main__':
    pool = Pool(processes=3)
    t=time.time()
    result = pool.map_async(findclosematch, wordlist, chunksize=100)
    #do something with result
    for r in result.get():
        pass
    print time.time()-t

# normal …
Run Code Online (Sandbox Code Playgroud)

python performance pool multiprocessing

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

使用Python的multiprocessing.pool,内存使用量不断增长

这是程序:

#!/usr/bin/python

import multiprocessing

def dummy_func(r):
    pass

def worker():
    pass

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=16)
    for index in range(0,100000):
        pool.apply_async(worker, callback=dummy_func)

    # clean up
    pool.close()
    pool.join()
Run Code Online (Sandbox Code Playgroud)

我发现内存使用(包括VIRT和RES)一直持续到close()/ join(),有没有解决方法摆脱这个?我用2.7尝试了maxtasksperchild,但它也没有帮助.

我有一个更复杂的程序,调用apply_async()〜6M次,并且在~1.5M点我已经有6G + RES,为了避免所有其他因素,我将程序简化为以上版本.

编辑:

原来这个版本效果更好,感谢大家的意见:

#!/usr/bin/python

import multiprocessing

ready_list = []
def dummy_func(index):
    global ready_list
    ready_list.append(index)

def worker(index):
    return index

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=16)
    result = {}
    for index in range(0,1000000):
        result[index] = (pool.apply_async(worker, (index,), callback=dummy_func))
        for ready in ready_list:
            result[ready].wait()
            del result[ready]
        ready_list = []

    # …
Run Code Online (Sandbox Code Playgroud)

python memory pool multiprocessing

27
推荐指数
5
解决办法
3万
查看次数

我可以在Pool.imap调用的函数中使用多处理队列吗?

我正在使用python 2.7,并尝试在自己的进程中运行一些CPU繁重的任务.我希望能够将消息发送回父进程,以使其了解进程的当前状态.多处理队列似乎是完美的,但我无法弄清楚如何让它工作.

所以,这是我的基本工作示例,减去队列的使用.

import multiprocessing as mp
import time

def f(x):
    return x*x

def main():
    pool = mp.Pool()
    results = pool.imap_unordered(f, range(1, 6))
    time.sleep(1)

    print str(results.next())

    pool.close()
    pool.join()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我尝试过以几种方式传递Queue,并且它们收到错误消息"RuntimeError:Queue对象应该只通过继承在进程之间共享".这是我根据我发现的早期答案尝试的方法之一.(我在尝试使用Pool.map_async和Pool.imap时遇到同样的问题)

import multiprocessing as mp
import time

def f(args):
    x = args[0]
    q = args[1]
    q.put(str(x))
    time.sleep(0.1)
    return x*x

def main():
    q = mp.Queue()
    pool = mp.Pool()
    results = pool.imap_unordered(f, ([i, q] for i in range(1, 6)))

    print str(q.get())

    pool.close()
    pool.join()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

最后,0适应方法(使其成为全局)不会生成任何消息,它只是锁定. …

python queue pool multiprocessing

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

Java中字符串池的基础机制?

我很好奇,为什么字符串可以在不调用创建new String(),作为API提到它是Objectclass java.lang.String

那么我们如何才能使用String s="hi"而不是String s=new String("hi")

这篇文章澄清了==运算符的使用和缺席,new 并说这是由于String文字被实际内容或从文字池中获取JVM,因此Strings是不可变的.

看到诸如此类的陈述

String s="hi"
Run Code Online (Sandbox Code Playgroud)

第一次真正发生了什么?

  1. 是否JVM像这样替换它String s=new String("hi"),其中创建了一个Object并将"hi"其添加到String文本池中,因此后续调用如String s1="hi"从池中获取?

  2. 这是底层机制的运作方式吗?如果是的话,那就是

    String s=new String("Test");
    String s1="Test";
    
    Run Code Online (Sandbox Code Playgroud)

    同样的

    String s="Test";
    String s1="Test";
    
    Run Code Online (Sandbox Code Playgroud)

    在内存利用率和效率方面

  3. 另外,有什么方法可以访问字符串池来检查它中有多少String文字,占用了多少空间等等?

java string performance jvm pool

23
推荐指数
5
解决办法
1826
查看次数

多处理IOError:错误的消息长度

IOError: bad message length在向map函数传递大参数时得到了一个.我怎么能避免这个?我设置N=1500或更大时会发生错误.

代码是:

import numpy as np
import multiprocessing

def func(args):
    i=args[0]
    images=args[1]
    print i
    return 0

N=1500       #N=1000 works fine

images=[]
for i in np.arange(N):
    images.append(np.random.random_integers(1,100,size=(500,500)))

iter_args=[]
for i in range(0,1):
    iter_args.append([i,images])

pool=multiprocessing.Pool()
print pool
pool.map(func,iter_args)
Run Code Online (Sandbox Code Playgroud)

在文档中multiprocessingrecv_bytes一个引发IOError 的函数.可能是因为这个吗?(https://python.readthedocs.org/en/v2.7.2/library/multiprocessing.html)

编辑 如果我使用imagesnumpy数组而不是列表,我得到一个不同的错误:SystemError: NULL result without error in PyObject_Call.有点不同的代码:

import numpy as np
import multiprocessing

def func(args):
    i=args[0]
    images=args[1]
    print i
    return 0

N=1500 …
Run Code Online (Sandbox Code Playgroud)

python numpy pool multiprocessing ioerror

21
推荐指数
2
解决办法
5441
查看次数

在终端和Django或Flask的代码模块中使用python多处理池

在python中使用multiprocessing.Pool时,如下代码,有一些奇怪的行为.

from multiprocessing import Pool
p = Pool(3)
def f(x): return x
threads = [p.apply_async(f, [i]) for i in range(20)]
for t in threads:
    try: print(t.get(timeout=1))
    except Exception: pass
Run Code Online (Sandbox Code Playgroud)

我得到以下错误三次(池中的每个线程一个),并打印"3"到"19":

AttributeError: 'module' object has no attribute 'f'
Run Code Online (Sandbox Code Playgroud)

前三个apply_async调用永远不会返回.

同时,如果我尝试:

from multiprocessing import Pool
p = Pool(3)
def f(x): print(x)
p.map(f, range(20))
Run Code Online (Sandbox Code Playgroud)

我得到了AttributeError 3次,shell打印"6"到"19",然后挂起并且不能被[Ctrl] + [C]杀死

多处理文档有以下说法:

此程序包中的功能要求模块可由子项导入.

这是什么意思?

为了澄清,我在终端中运行代码来测试功能,但最终我希望能够将其放入Web服务器的模块中.你如何在python终端和代码模块中正确使用multiprocessing.Pool?

python django pool multiprocessing flask

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

回调函数如何在python多处理map_async中工作

我花了整整一夜调试我的代码,最后我发现了这个棘手的问题.请看下面的代码.

from multiprocessing import Pool

def myfunc(x):
    return [i for i in range(x)]

pool=Pool()

A=[]
r = pool.map_async(myfunc, (1,2), callback=A.extend)
r.wait()
Run Code Online (Sandbox Code Playgroud)

我以为我会得到A=[0,0,1],但输出是A=[[0],[0,1]].这对我来说没有意义,因为如果我有A=[],A.extend([0])A.extend([0,1])会给我A=[0,0,1].可能回调的工作方式不同.所以我的问题是如何A=[0,0,1]取而代之[[0],[0,1]]?提前感谢您的任何意见.

python pool multiprocessing

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