我正在开发一个项目,该项目使用一个队列来保存有关需要发送到远程主机的消息的信息.在这种情况下,一个线程负责将信息放入队列,另一个线程负责从队列中获取信息并发送它.第二个线程需要定期检查队列中的信息.
但后来我发现这是轮子的重新发明:)我可以使用阻塞队列来达到这个目的.
使用阻塞队列进行上述应用程序的其他优点是什么?(例如:性能,代码可修改,任何特殊技巧等)
首先,只是授予我实际上想要的功能Queue<T>- FIFO,通常只需要Enqueue/ Dequeue等等 - 所以我更喜欢"你真正想要的是什么"之外的答案List<T>(我知道)关于RemoveAt).
例如,假设我有一个Queue<DataPoint> dataToProcess数据点需要按照它们到达的顺序进行处理.然后定期有一些像这样的代码是有意义的:
while (dataToProcess.Count > 0) {
DataPoint pointToProcess = dataToProcess.Dequeue();
ProcessDataPoint(pointToProcess);
}
Run Code Online (Sandbox Code Playgroud)
但是,无论出于何种原因,我们都会发现,不应该处理已添加到队列中的特定数据点.那么如果有一种类似于以下的方法,那将是理想的:
dataToProcess.Remove(badPoint);
Run Code Online (Sandbox Code Playgroud)
我明白,实际上没有可行的方法来获得一种Remove不涉及某种形式的枚举的方法; 但是,因为a Queue<T>并不是真的让你随便走进并随机删除一些项目,我能想出的唯一解决方案是:
bool Remove(T item) {
bool itemFound = false;
// set up a temporary queue to take items out
// one by one
Queue<T> receivingQueue = new Queue<T>();
// move all non-matching items out into the
// temporary queue
while (this.Count > …Run Code Online (Sandbox Code Playgroud) 我认为它们非常相似......我们何时需要使用堆栈或队列,为什么不使用ArrayList或LinkedList来替换它们呢?
这是我的情景:
当用户登录我的网站时,我会为给定用户排队一堆任务(通常每个任务需要100个msecs,每个用户有100个任务).这些任务排队到默认的Celery队列,我有100个工作人员正在运行.我使用websockets来显示用户在后端完成任务时的实时进度.如果我只有1或2个用户活跃,那么生活是美好的.
现在,如果我有几个并发用户登录到我的站点,后面的用户排在初始用户后面并且他们的任务会饿死(因为所有任务都进入同一个队列).我的想法是为每个用户创建一个动态队列以确保公平.但是根据Celery文档(http://docs.celeryproject.org/en/latest/userguide/routing.html#defining-queues),我似乎需要静态定义队列.
关于在我的场景中使用芹菜的最佳实践的任何建议?
阅读了几篇描述Node.js事件循环的文章和文档,例如Node.js自己提供的文章和文档:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick /
我根本无法解决这个问题:为什么事件循环需要几个阶段,每个阶段都有自己的回调队列?
所有文档和文章都描述了循环的阶段,"这个阶段确实如此,并执行使用X或Y设置的回调",但从未真正阐述为什么这些单独的队列首先是必要的.
为什么setTimeout()或setImmediate()或socket闭包的回调需要在与轮询阶段不同的点执行,而轮询阶段应该执行绝大部分的回调?
如果轮询阶段的回调队列在转移到下一阶段之前已经耗尽,为什么不只是为了在其他阶段中执行任何非队列相关操作而中断一个队列?
我想使用java.util.ConcurrentLinkedQueue作为Servlet的非持久队列.这是来自类的javadoc的模糊.
基于链接节点的无界线程安全队列.当许多线程共享对公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择.此队列不允许null元素.
现在假设我在servlet上有1000个并发请求,每个线程都需要将一个对象嵌入到ConcurrentLinkedQueue中.从描述中,我应该得出结论,处理负载没有问题吗?我需要的保证是:
谢谢
我希望能够加入()队列类,但是如果调用尚未返回,则会在一段时间后超时.最好的方法是什么?是否可以通过使用元类继承queue \来实现?
我最近在http://allseeing-i.com上看到ASIHTTP正在停产的消息.我非常尊重图书馆的制作者.但是,我现在正在寻找一种替代品,它也支持iOS上的排队下载(多线程),它还支持具有适当信息的进度条.
是否有任何(希望是轻量级)库,这是一个活跃的开发生命周期?ARC支持也将受到高度赞赏.
非常感谢你的想法.
我想找到一个队列结构(数据容器),其元素必须先进先出.对我来说重要的是结构必须是线程安全的.我将使用此数据容器作为任务或连接池.
我知道缓冲通道是线程安全的,但我不知道它是否作为FIFO工作,尤其是在并发情况下.
如果可以将缓冲通道用作线程安全队列,我是否需要担心其效率?
我有一个webapi,旨在以队列方式处理报告.该应用程序采取的步骤如下:
我当时正在考虑使用Entity Framework来创建排队项目的数据库,例如:
public class EFBatchItem
{
[Key]
public string BatchId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateCompleted { get; set; }
public string BatchItem { get; set; }
public BatchStatus Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的问题 - 是否有一种更有效的方法,使用NServiceBus,BlockingCollection或ConcurrentQeueue,而不是不断轮询数据库并逐个拉出待处理的项目?我之前没有使用过队列.
一种想法是创建一个任务队列,并在一个单独的线程上处理所有挂起的任务.有点类似于使用线程处理队列的最有效方法,但我想确保我走的是最有效的路由.
编辑:我在这里遇到的一个重要问题是向用户显示进度的最佳方式.一旦用户提交内容,他就会进入新页面,并可以按批次标识符查看状态.MSMQ是必需的,还是NServiceBus,以便通知用户?这似乎是REquest/Acknowledge/Push范式的变体?