我需要从Java应用程序管理与外部服务器的长时间运行的TCP套接字连接.我正在寻找一个好的套接字池,所以我将能够重新使用套接字.有什么建议吗?
我正在四处寻找一种方法来改进处理大量文件的JAXB Unmarshalling性能并找到以下建议:
"如果你真的关心性能,和/或你的应用程序会读取很多小文档,那么创建Unmarshaller可能是一个相对昂贵的操作.在这种情况下,考虑汇集Unmarshaller对象"
谷歌搜索网络找到一个这样的例子没有返回任何东西,所以我认为可能有兴趣将我的实现放在这里使用Spring 3.0和Apache Commons Pool.
UnmarshallerFactory.java
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import org.apache.commons.pool.KeyedPoolableObjectFactory;
import org.springframework.stereotype.Component;
/**
* Pool of JAXB Unmarshallers.
*
*/
@Component
public class UnmarshallerFactory implements KeyedPoolableObjectFactory {
// Map of JAXB Contexts
@SuppressWarnings("rawtypes")
private final static Map<Object, JAXBContext> JAXB_CONTEXT_MAP = new HashMap<Object, JAXBContext>();
@Override
public void activateObject(final Object arg0, final Object arg1) throws Exception {
}
@Override
public void passivateObject(final Object arg0, final Object arg1) throws Exception {
}
@Override
public final …
Run Code Online (Sandbox Code Playgroud) 所以我过去几天一直在搞乱python的多处理库,我真的很喜欢处理池.它易于实现,我可以想象很多用途.我之前已经完成了几个我已经听过的项目以熟悉它,并且最近完成了一个蛮力游戏的程序.
Anywho,我正在执行一个执行时间计算,总结100万到200万单线程和处理池之间的所有素数.现在,对于hangman cruncher来说,将游戏放入处理池可以将执行时间提高大约8倍(i7有8个核心),但是当研究出这些素数时,它实际上将处理时间增加了近4倍.
谁能告诉我为什么会这样?以下是有兴趣查看或测试它的人的代码:
#!/user/bin/python.exe
import math
from multiprocessing import Pool
global primes
primes = []
def log(result):
global primes
if result:
primes.append(result[1])
def isPrime( n ):
if n < 2:
return False
if n == 2:
return True, n
max = int(math.ceil(math.sqrt(n)))
i = 2
while i <= max:
if n % i == 0:
return False
i += 1
return True, n
def main():
global primes
#pool = Pool()
for i in range(1000000, 2000000): …
Run Code Online (Sandbox Code Playgroud) 我正处于一个问题,我无法决定采取哪种解决方案.
这个问题有点独特.让我们这样说,我从网络连续接收数据(每秒2到4次).现在,每个数据都属于不同的组合.现在,让我们调用这些组,group1,group2等.
每个组都有一个专用的作业队列,来自网络的数据被过滤并添加到其相应的组进行处理.
起初我为每个组创建了一个专用线程,它将从作业队列中获取数据,处理它然后进入阻塞状态(使用链接阻塞队列).
但我的大四学生建议我应该使用线程池,因为这样线程不会被阻塞,并且可供其他组处理.
但事实上,数据即时获取的速度足够快,并且线程处理它的时间足够长,因此线程可能不会进入阻塞模式.这也将保证数据按顺序处理(作业1在作业2之前完成),这在汇集时可能不会发生.
我的大四学生也倾向于这样一个事实,即汇集也会为我们节省大量的内存,因为线程已经被淘汰了(我以为他真的想要这个词;)).虽然我不同意这个,因为,我个人认为,汇集与否每个线程都有自己的堆栈内存.除非线程池中有某些我不知道的东西.
最后一件事,我一直认为汇集有助于工作在短时间内出现大量工作.这是有道理的,因为线程生成会导致性能下降,因为初始化线程所花费的时间比执行作业所花费的时间多得多.所以汇集在这里有很多帮助.
但在我的情况下,group1,group2,...,groupN始终保持活着状态.因此,如果有数据,他们仍然会在那里.因此,线程产生不是问题所在.
我的大四学生不相信,并希望我采用汇集解决方案,因为它的内存占用很大.
那么,走哪条路呢?
谢谢.
我正在寻找一个负载均衡的线程池到目前为止没有成功.(不确定负载平衡是否是正确的措辞).让我解释一下我试图实现的目标.
第1部分:我有乔布斯,有8到10个单一任务.在6核CPU上,让8个线程并行处理这个任务,这似乎可以提供最佳的性能.当一个任务准备就绪时,另一个任务就可以开始.完成所有十项任务后,完成整个工作.通常,工作在30到60秒内完成.
第二部分:有时,不幸的是,这项工作需要两个多小时.由于必须计算的数据量,这是正确的.坏的是,在job1运行时没有其他工作可以启动(假设所有线程具有相同的持续时间),因为它正在使用所有线程.
我的第一个想法:拥有12个线程,并行允许最多三个作业.但是:这意味着,当只有一份工作时,这项工作就没有完全实现.
我正在寻找一种解决方案,在没有其他工作的情况下为作业1提供全部CPU能力.但是当另一个工作需要在另一个工作时启动时,我希望将CPU功率分配给这两个工作.当第三或第四个工作出现时,我希望cpu电源公平地分配给所有四个工作.
我赞成你的答案......
提前致谢
我正在对我的代码应用一些并行化,我在其中使用类.我知道如果不采用Python提供的任何其他方法,就不可能选择类方法.我在这里找到了解决方案.在我的代码中,我必须使用类来并行化部分.在这里,我发布了一个非常简单的代码,只是代表我的结构(是相同的,但是我删除了方法内容,这是很多数学计算,对于我得到的输出来说是微不足道的).问题是'因为我可以腌制一种方法(shepard_interpolation),但是另一种方法(calculate_orientation_uncertainty)我得到了泡菜错误.我不知道为什么会这样,或者为什么它会起作用.
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
if func_name.startswith('__') and not func_name.endswith('__'): #deal with mangled names
cls_name = cls.__name__.lstrip('_')
func_name = '_' + cls_name + func_name
print cls
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.__mro__:
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
class ImageData(object):
def __init__(self, width=60, height=60):
self.width = width
self.height = height
self.data = []
for i in range(width):
self.data.append([0] …
Run Code Online (Sandbox Code Playgroud) 我可以找到很多关于如何使用连接池的问题以及为什么这是一个好主意,但我想知道我是否真的需要它.
我正在创建一个服务器应用程序,虽然它是多线程的,但我一直小心,只有一个线程可以访问我的数据库连接.
那么使用连接池有什么意义吗?
我不能只在生命周期开始时打开与数据库的连接并永远使用那个连接,或者如果长时间处于非活动状态,它会超时吗?
我绝对要叫close()
我连接上我用它做什么之后呢,还是足够的通话close()
上ResultSet
和/或Statement
?
我已将spring boot应用程序迁移到2.0,并发现了hikari连接池的一些问题.当我获取数据库数据时,这导致hikari cp超时ie.连接不可用.我不知道为什么在以前的版本中这个工作正常.
因此我尝试使用此配置的tomcat池,application.yml
但它不起作用(正确的YAML格式).
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
Run Code Online (Sandbox Code Playgroud)
我的pom.xml有这些与DB事物相关的依赖:
spring-boot-jpa
spring-boot-jdbc
jdbc7
Run Code Online (Sandbox Code Playgroud)
如何排除hikari并使用tomcat连接池?
我读了一些关于窗口线程池的部分.它看起来像CLR线程池.
CLR基于Windows,所以CLR线程基于windows线程池,是不是?
我知道每个.net进程都有一个线程池,windows线程池中的情况是什么?操作系统有一个线程池还是多个?
在C#中,开发人员可以通过代码控制窗口线程池吗?
我试图在Python中使用多处理池.这是我的代码:
def f(x):
return x
def foo():
p = multiprocessing.Pool()
mapper = p.imap_unordered
for x in xrange(1, 11):
res = list(mapper(f,bar(x)))
Run Code Online (Sandbox Code Playgroud)
当代码xrange
很小时,这段代码使用所有CPU(我有8个CPU)xrange(1, 6)
.但是,当我将范围增加到xrange(1, 10)
.我观察到只有1个CPU以100%运行,而其余的只是空转.可能是什么原因?是因为,当我增加范围时,操作系统会因过热而关闭CPU吗?
我该如何解决这个问题?
为了复制我的问题,我创建了这个例子:它是一个来自字符串问题的简单ngram生成.
#!/usr/bin/python
import time
import itertools
import threading
import multiprocessing
import random
def f(x):
return x
def ngrams(input_tmp, n):
input = input_tmp.split()
if n > len(input):
n = len(input)
output = []
for i in range(len(input)-n+1):
output.append(input[i:i+n])
return output
def foo():
p = multiprocessing.Pool()
mapper = p.imap_unordered …
Run Code Online (Sandbox Code Playgroud)