为什么会这样?问题是监视器对象肯定不是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) 是否看到
urllib3.connectionpool WARNING - Connection pool is full, discarding connection
Run Code Online (Sandbox Code Playgroud)
意味着我正在有效地丢失数据(因为连接丢失)
或者这
是否意味着连接被丢弃(因为池已满);但是,当连接池可用时,稍后会重试相同的连接吗?
我有一个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需要它.
(这个问题是关于如何使多处理.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) 这是程序:
#!/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 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适应方法(使其成为全局)不会生成任何消息,它只是锁定. …
我很好奇,为什么字符串可以在不调用创建new String()
,作为API提到它是Object
的class
java.lang.String
那么我们如何才能使用String s="hi"
而不是String s=new String("hi")
?
这篇文章澄清了==
运算符的使用和缺席,new
并说这是由于String
文字被实际内容或从文字池中获取JVM
,因此Strings
是不可变的.
看到诸如此类的陈述
String s="hi"
Run Code Online (Sandbox Code Playgroud)
第一次真正发生了什么?
是否JVM
像这样替换它String s=new String("hi")
,其中创建了一个Object并将"hi"
其添加到String文本池中,因此后续调用如String s1="hi"
从池中获取?
这是底层机制的运作方式吗?如果是的话,那就是
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)
在内存利用率和效率方面?
另外,有什么方法可以访问字符串池来检查它中有多少String
文字,占用了多少空间等等?
我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)
在文档中multiprocessing
有recv_bytes
一个引发IOError 的函数.可能是因为这个吗?(https://python.readthedocs.org/en/v2.7.2/library/multiprocessing.html)
编辑
如果我使用images
numpy数组而不是列表,我得到一个不同的错误: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中使用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?
我花了整整一夜调试我的代码,最后我发现了这个棘手的问题.请看下面的代码.
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]]
?提前感谢您的任何意见.