【发布时间】:2014-04-25 17:54:36
【问题描述】:
背景:我需要以异步方式向WebSocket客户端发送许多小消息。消息通常在高峰期发送,因此在暂停一段时间后,我需要快速发送约 5000 条消息。所以问题是:
- 我不想在单线程中启动 5000 个异步
- 我不想串行循环“启动异步”-“等待完成”5000 次
- 我不想使用 5000 个线程,每个线程只有一个“启动异步”-“等待完成”
最好的方法是为每个线程分组约 20 个异步,所以我需要非常具体的队列:
- lot of 表示队列中的并发推送/轮询
-
small-sized asynchronous 表示我想以捆绑方式轮询,例如 每个队列有 1 到 20 条消息
take()(这样我就可以启动 1...20 次异步 I/O并等待单线程完成) - 立即 表示我不想等到 20 条消息被轮询,只有当队列有很多消息时才应该使用 bundle-poll。应立即轮询并发送一条消息。
所以基本上:我需要像队列这样的结构,在单个阻塞调用中具有阻塞 take(1 到 X) 等待元素。伪代码:
[each of ~50 processing threads]:
messages = queue.blockingTake( max 10 or at least 1 if less than 10 available );
for each message: message.startAsync()
for each message: message.waitToComplete()
repeat
【问题讨论】:
标签: java concurrency websocket queue producer-consumer