我有一个使用全局线程池的现有java/scala应用程序.我想开始在项目中使用actor,但希望应用程序中的所有内容都使用相同的池.
我知道我可以设置actor使用但希望共享线程池的最大线程数.这是否必要/合理,是否可以指定actor的线程池?
如果不可能/推荐,在已经使用线程的应用程序中集成actor时是否有任何经验法则?
谢谢.
我目前有这段代码(随意评论:))
def threaded_convert_to_png(self):
paths = self.get_pages()
pool = Pool()
result = pool.map(convert_to_png, paths)
self.image_path = result
Run Code Online (Sandbox Code Playgroud)
在Intel i7上,它在Linux上运行时会产生8个工作线程; 但是,在运行Windows 8.1 Pro时,它只会生成一个工作程序.我检查并cpu_count()
在Linux和Windows上返回8.
PS这是在Python 2.7.6中
我正在GenericObjectPool
通过放入Cipher
池进行研究,以便可以重复使用.
GenericObjectPool<Cipher> pool;
CipherFactory factory = new CipherFactory();
this.pool = new GenericObjectPool<Cipher>(factory);
pool.setMaxTotal(10);
pool.setBlockWhenExhausted(true);
pool.setMaxWaitMillis(30 * 1000);
Run Code Online (Sandbox Code Playgroud)
CipherFactory
public class CipherFactory extends BasePooledObjectFactory<Cipher> {
private boolean running = false;
@Override
public Cipher create() throws Exception {
return Cipher.getInstance("DESede/CBC/NoPadding");
}
@Override
public PooledObject<Cipher> wrap(Cipher arg0) {
return new DefaultPooledObject<Cipher>(arg0);
}
@Override
public boolean validateObject(PooledObject<Cipher> p) {
//Ensures that the instance is safe to be returned by the pool
return true;
}
@Override
public void destroyObject(PooledObject<Cipher> p) { …
Run Code Online (Sandbox Code Playgroud) 如果我有一个1核心的服务器,有多少puma worker,thread和什么数据库池大小合适?
一般大拇指在这里是什么?
在编写安全框架时,我面临着一个常见的困境:"汇集或不汇集"
基本上这个问题分为两个"群体":
第1组:SecureRandom
因为调用nextBytes(...)
是同步的,它可能成为WebApp /多线程应用程序的瓶颈
第2组:加密服务提供商,如MessageDigest
,Signature
,Cipher
,KeyFactory
,...(因为的成本getInstance()
?)
你有什么意见 ?
你在这些问题上的习惯是什么?
我终于花时间自己测试了@Qwerky Share
课程,我觉得结果很......令人惊讶.
这个类缺乏我的主要关注:像GenericObjectPool或StackObjectPool这样的池.
所以我重新修改了这个类以测试所有4种选择:
我不得不将循环次数降低到100000,因为1M花了太多时间在游泳池上.
我还在Thread.yield()
每个循环的末尾添加了一个,以使负载具有更好的形状.
结果(累积运行时):
我正在使用renderfarm,我需要我的客户端能够启动渲染器的多个实例,而不会阻塞,因此客户端可以接收新的命令.我已经正常工作,但是我无法终止创建的进程.
在全局级别,我定义了我的池(以便我可以从任何函数访问它):
p = Pool(2)
Run Code Online (Sandbox Code Playgroud)
然后我用apply_async调用我的渲染器:
for i in range(totalInstances):
p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()
Run Code Online (Sandbox Code Playgroud)
该函数完成,在后台启动进程,并等待新命令.我做了一个简单的命令,将杀死客户端并停止渲染:
def close():
'close this client instance'
tn.write ("say "+USER+" is leaving the farm\r\n")
try:
p.terminate()
except Exception,e:
print str(e)
sys.exit()
sys.exit()
Run Code Online (Sandbox Code Playgroud)
它似乎没有给出错误(它会打印错误),python终止但后台进程仍在运行.任何人都可以推荐更好的方法来控制这些推出的程序吗
所以,我正在尝试编写一个使用django作为其ORM的应用程序,因为它需要做一些幕后处理和易于使用的前端.它的核心功能是处理数据库中的数据,在高CPU过程中(基本上是monte carlo模拟),我想实现多处理,特别是使用Pool(我得到4个进程).基本上我的代码就是这样运行的,父代大约有20个孩子:
assorted import statements to get the django environment in the script
from multiprocessing import Pool
from random import random
from time import sleep
def test(child):
x=[]
print child.id
for i in range(100):
print child.id, i
x.append(child.parent.id) #just to hit the DB
return x
if __name__ == '__main__':
parent = Parent.objects.get(id=1)
pool = Pool()
results = []
results = pool.map(test,parent.children.all())
pool.close()
pool.join()
print results
Run Code Online (Sandbox Code Playgroud)
使用这样的代码,我得到间歇性的DatabaseError
s或PicklingError
s.前者通常是"格式错误的数据库"或"与MySQL服务器失去连接"的形式,后者通常是"不能泡菜型号.DoesNotExist".它们是随机的,随任何进程发生,当然DB本身没有任何问题.如果我设置pool = Pool(proccesses=1)
它然后运行,在一个线程就好了.我还会抛出各种打印语句,以确保它们中的大多数实际上都在运行.
我也一直在test
改为:
def test(child):
x=[] …
Run Code Online (Sandbox Code Playgroud) 作为一个PreparedStatatement
包含预编译的sql命令,所以当我们创建这种类型的池时,为了不创建和销毁这个对象太多(就像线程池一样).
它有意义吗?或者我只是如此困惑?
我有一个函数执行一些模拟并返回一个字符串格式的数组.
我想运行模拟(函数)来改变输入参数值,超过10000个可能的输入值,并将结果写入单个文件.
我正在使用多处理,特别是pool.map函数来并行运行模拟.
由于运行模拟功能超过10000次的整个过程需要很长时间,我真的想跟踪整个操作的过程.
我认为下面我当前代码中的问题是,pool.map运行该函数10000次,在这些操作期间没有任何进程跟踪.一旦并行处理完成10000次模拟(可能是几小时到几天),那么我会在10000个模拟结果被保存到文件时继续跟踪.所以这并不是真正跟踪pool.map操作的处理.
是否可以轻松修复我的代码,以便进行流程跟踪?
def simFunction(input):
# Does some simulation and outputs simResult
return str(simResult)
# Parallel processing
inputs = np.arange(0,10000,1)
if __name__ == "__main__":
numCores = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes = numCores)
t = pool.map(simFunction, inputs)
with open('results.txt','w') as out:
print("Starting to simulate " + str(len(inputs)) + " input values...")
counter = 0
for i in t:
out.write(i + '\n')
counter = counter + 1
if counter%100==0:
print(str(counter) + " of " + str(len(inputs)) + " input …
Run Code Online (Sandbox Code Playgroud)