我的要求很容易理解.
我想从我的Java Web应用程序调用Web服务,每分钟限制最多10次Web服务调用.在1分钟后,我可以建立另外10个连接,无论之前的10个webservice调用的状态(已完成或未完成).
有人可以指导我实现这个的方法吗?任何教程或有用的链接?
我需要创建一个套接字连接池,它将被提供给多个工作线程.是否有一个线程安全的对象池实现,其功能类似于Apache Commons GenericObjectPool?
这可能看起来很奇怪,但我会尝试将其合理化.我目前广泛使用boost.object_pool与shared_ptr一起使用,最近我遇到了一种情况,我需要拍摄当前程序状态的快照,以便进行全尺寸重放/回滚/快进等功能.
所以我不是试图克隆一个对象池在其他地方使用,这显然不会起作用,因为即使我被boost.pool的接口允许这样做(我不是这样),也没有指向块的有效指针在那个新克隆的游泳池里,它只会毫无意义.但我的用例是,如果有重放/回滚需求,我想将其" 粘贴 "回原始池中.
我当然可以手动复制和克隆所有状态,对象和子状态,子对象和子子...然后将它们打包成快照,并希望一切都会正确,但鉴于复杂性,这很容易出错该项目已经有了,并且它要比我直接复制内存慢得多.使用Command模式(或类似物)来实现undo-redo也是不可能的,因为undo-redo机制不是我的意图.
我只是想知道我是否使用顽固的传统C方式从头开始再做项目,而简单的memcpy(snapshot,all_states,size)调用几乎可以完成所有工作.
我还有其他选择吗?是否有任何boost.object_pool实现允许您克隆底层内存区域?在考虑到这种情况的情况下,侵入性地刺激boost.object_pool是一个合理的选择吗?
我在一个网络服务服务器上,我有一个内部连接的对象。
初始化这个连接需要很长时间,所以我的想法是使用对象池来重用不同请求之间的连接。
对象连接到每个用户,所以我更喜欢使用用户名作为键和连接作为值。但我不想永远打开连接。也许一段时间后,如果用户不再开始请求,它应该被销毁。
我想过使用apache 对象池,但我没有在那里看到过期(如果我错了,请纠正我)
ehcache 为我提供有关驱逐和到期的通知,但不会在超时结束后触发,仅当再次触及缓存对象时才触发。
有人知道可以为我完成这项工作的库吗?
我正在构建一个基于 UDP 的应用程序,用于接收和发送多个数据包。
我可以为每次发送构建一个新的实例DatagramPacket,或者在应用程序的生命周期中回收一个实例。
DatagramPacket?(例如内存分配)将ArrayPool与引用类型一起使用的正确方法是什么?
我以为它将充满用默认构造函数“更新”的对象。
例如,在下面的代码中,Foobars当您第一次从ArrayPool中租用时,所有的都为null。
2个问题:
由于返回的对象.Rent最初都是null,因此是否需要先用初始化的对象填充数组池?
返回租用的物品时,我需要清除每个物品吗?例如,foobar.Name = null; foobar.Place = null等等。
public class Program
{
public class Foobar {
public string Name {get;set;}
public string Place {get;set;}
public int Index {get;set;}
}
public static void Main()
{
ArrayPool<Foobar> pool = ArrayPool<Foobar>.Shared;
var foobars = pool.Rent(5);
foreach(var foobar in foobars) {
// prints "true"
Console.WriteLine($"foobar is null? ans={foobar == null}");
}
}
}
Run Code Online (Sandbox Code Playgroud) 情况:我指的是项目的教程,代码中有一个对象池概念.
问题:在我编写生成平台(PlatformManager.cs)脚本之后,我得到一个例外,
InvalidOperationException:由于对象的当前状态,操作无效System.Collections.Generic.Queue`1 [UnityEngine.Transform] .Peek()PlatformManager.Update()(在Assets/Platform/PlatformManager.cs:35)
PlatformManager.cs脚本:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlatformManager : MonoBehaviour {
public Transform prefab;
public int numberOfObjects;
public float recycleOffset;
public Vector3 startPosition;
public Vector3 minSize, maxSize,minGap, maxGap;
public float minY, maxY;
private Vector3 nextPosition;
private Queue<Transform> objectQueue;
void Start () {
objectQueue = new Queue<Transform>(numberOfObjects);
for (int i = 0; i < numberOfObjects; i++) {
objectQueue.Enqueue((Transform)Instantiate(prefab));
}
nextPosition = startPosition;
for (int i = 0; i …Run Code Online (Sandbox Code Playgroud) 哪种方法更适合访问非线程安全对象?
使用ThreadLocal对象:
static final ThreadLocal<NonThreadSafeParser> PARSER_THREAD_LOCAL = new ThreadLocal<NonThreadSafeParser>() {
@Override
protected NonThreadSafeParser initialValue() {
return new NonThreadSafeParser();
}
};
void parse(String input) {
PARSER_THREAD_LOCAL.get().parse(input);
}
Run Code Online (Sandbox Code Playgroud)
使用并发对象池:
static final ConcurrentObjectPool<NonThreadSafeParser> PARSER_POOL = new ConcurrentObjectPool<>();
void parse(String input) {
NonThreadSafeParser parser = PARSER_POOL.borrow();
try {
parser.parse(input);
} finally {
PARSER_POOL.release(parser);
}
}
Run Code Online (Sandbox Code Playgroud)
或您想提供的其他方法?
重要因素是:
一般情况下,有什么优点和缺点的每个方法?
它们之间有什么明显的区别吗?
谢谢。
编辑:
我目前正在尝试为竞赛构建一些代码执行优化,并且正在研究ObjectPool模式以支持对象重用而不是新的对象实例化.
我已经组建了一个小项目(和唯一的测试类)来调查我看到和不理解的一些事情.
我在做什么:
我得到的结果是:
Figures are for new instantiation vs with object pool for 5 000 000 iterations
without_warmup_without_new_object_use_with_random_parameters: 417 vs 457
without_warmup_without_new_object_use_with_fixed_parameters: 11 vs 84
without_warmup_with_new_object_use_with_random_parameters: 515 vs 493
without_warmup_with_new_object_use_with_fixed_parameters: 64 vs 90
with_warmup_without_new_object_use_with_random_parameters: 284 vs 419
with_warmup_without_new_object_use_with_fixed_parameters: 8 vs 55
with_warmup_with_new_object_use_with_random_parameters: 410 vs 397
with_warmup_with_new_object_use_with_fixed_parameters: 69 vs 82
我从中注意到了什么:
我在这里寻找的是理解这些结果,并获得我可以阅读的文档/书籍的指示,以便充分了解在这些情况下幕后发生的事情.
谢谢!
我很好奇之前是否有人尝试过在 Go 中池化地图?我之前读过有关池化缓冲区的内容,我想知道通过类似的推理,如果必须频繁创建和销毁它们,或者是否有任何原因,先验地认为池化映射可能效率不高,那么池化映射是否有意义。当映射返回到池中时,必须迭代它并删除所有元素,但似乎流行的建议是创建一个新映射,而不是删除已分配的映射中的条目并重用它让我觉得池化地图可能没有那么有益。
object-pooling ×10
java ×5
c# ×2
c++ ×2
performance ×2
boost ×1
clone ×1
concurrency ×1
datagram ×1
go ×1
hashmap ×1
pool ×1
thread-local ×1
throttling ×1
tomcat6 ×1
udp ×1