问题标签 [producer-consumer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1624 浏览

concurrency - 简单的生产者-消费者问题,但生产者更新旧缓冲区

假设我有两个缓冲区。生产者填充缓冲区#1,然后填充缓冲区#2。消费者一次消耗一个缓冲区,而且非常慢。当它正在消耗缓冲区 #1 时,生产者准备填充另一个缓冲区,但它们都已满,消费者尚未完成 #1。所以,生产者等待。

我希望生产者更新“空闲”缓冲区,而不是等待。也就是说,当消费者使用缓冲区#1 时,生产者应该在缓冲区#2 准备好后立即将新数据写入缓冲区(“旧”数据被覆盖并丢失)。如果消费者还没有完成#1,而生产者有更多数据要写入,它应该 再次写入#2,依此类推。当消费者最终消费完#1中的所有数据时,它应该立即开始消费缓冲区#2中新写入的数据,生产者应该继续更新#1。

(假设生产者正在高速实时获取视频帧,而消费者正在缓慢地处理它们;消费者不介意跳过某些帧,但它必须始终处理获取的最后一帧。相反,生产者不能减速也不等待,因为它必须获取每一帧)。

有没有办法用信号量做这种事情?这是一个众所周知的并发问题吗?而且,以防万一,是否可以将此问题扩展到 n > 2 个缓冲区?

谢谢!

0 投票
2 回答
16218 浏览

python - Python - 从管道中简单读取行

我正在尝试从管道中读取行并对其进行处理,但我正在做一些愚蠢的事情,我不知道是什么。生产者将无限期地继续生产线,如下所示:

生产者.py

消费者只需要定期检查线路:

消费者.py

当我在 Windows shell as 中运行它时python producer.py | python consumer.py,它只是永远休眠(似乎从不获取数据?)似乎问题在于生产者永远不会终止,因为如果我发送有限数量的数据,那么它就可以正常工作。

如何获取要接收的数据并显示给消费者?在实际应用程序中,生产者是我无法控制的 C++ 程序。

0 投票
2 回答
376 浏览

ruby - ruby Openid 兼容库

我正在使用符合 ruby​​ openid 的库,因此我可以成为 openid 消费者,我得到了示例,当我尝试启动服务时,它会显示如下错误

任何想法将不胜感激,谢谢

0 投票
1 回答
2101 浏览

c# - 如何等待阻塞队列被工作人员清空

我正在使用带有阻塞队列的单个生产者-单个消费者模型。我希望生产者在完成生产后等待队列清空后再返回。

我实现了Marc Gravell建议的BlockingQueue。

在我的模型中,生产者(渲染器)使用事件来通知工作人员(打印机)何时渲染文件(工作人员将项目排队)以及每个文件都已被渲染(完成)。

现在,当渲染器完成时,方法结束并且工作人员被杀死,所以我最终得到了 10-15 个尚未打印的渲染文件。

我希望完成的事件处理程序阻塞,直到队列被清空,例如,当所有文件都被打印时。我想添加类似于“WaitToClose()”的方法,该方法将阻塞直到队列为空。

(设置工作线程会IsBackground = true有所作为吗?)

0 投票
6 回答
21025 浏览

c# - C# 生产者/消费者模式

我有如下简单的一个生产者/两个消费者的代码,但输出显示只有C2消耗。我的代码中是否有任何错误?

输出是:

0 投票
4 回答
1670 浏览

multithreading - 多生产者/单消费者模型中的最佳睡眠时间

我正在编写一个具有多个生产者、单个消费者模型的应用程序(多个线程将消息发送到单个文件编写器线程)。

每个生产者线程包含两个队列,一个用于写入,一个用于读取。消费者线程的每个循环,它遍历每个生产者并锁定该生产者的互斥体,交换队列,解锁并从生产者不再使用的队列中写出。

在消费者线程的循环中,它在处理完所有生产者线程后休眠一段指定的时间。我立即注意到的一件事是,当我从 1 个生产者线程移动到 2 个生产者线程时,生产者将某些内容写入队列并返回的平均时间显着增加(增加了 5 倍)。随着添加更多线程,这个平均时间会减少,直到它触底out - 10 个制作人与 15 个制作人花费的时间没有太大区别。这大概是因为有更多的生产者要处理,生产者线程的互斥体的争用较少。

不幸的是,拥有 < 5 个生产者是应用程序相当常见的场景,我想优化睡眠时间,以便无论存在多少生产者,我都能获得合理的性能。我注意到,通过增加睡眠时间,我可以在生产者数量少的情况下获得更好的性能,但对于生产者数量较多的情况,性能会更差。

有没有其他人遇到过这种情况,如果有,您的解决方案是什么?我试过用线程数来调整睡眠时间,但它似乎有点机器特定的并且相当反复试验。

0 投票
3 回答
2859 浏览

c - 多生产者/消费者和临界区代码问题

我正在尝试 C 中的多生产者/消费者问题,但它没有按预期工作。以下是一些代表我的实现的伪代码。

但是,使用此解决方案,data1 将被填满,但 thread2 将锁定并且永远不会运行。我的实现有问题吗?

编辑#1

我发现的问题之一是我的第二个互斥锁没有正确创建。我不知道它有什么问题,所以我只是对所有线程使用第一个互斥锁。为了让它正常工作,我还做了一些其他的事情,所以稍后我会更新我的伪代码以反映这一点。

0 投票
2 回答
1635 浏览

c# - 多生产者、多消费者和商店问题

我有一个场景,多个生产者在网络中的不同机器上运行。这些是单例 WCF 服务,它们在中央存储中对产品(输出)进行排队,这也是单例 WCF 服务。

有些消费者通过 JSON 请求调用中央存储,将产品从中央存储中取出。通过解决某些优先级约束来交付产品。生产者在一分钟内以非常高的速度生产约 10000 件产品,其目的是以同样的速度为消费者提供服务,而不是让他们等待。

只要我有 3-4 个生产者和最多 10 个消费者,一切都很好。但是当我增加生产者和消费者时,一切都冻结了。

我使用的是TimedLock,它是 Monitor.TryEnter 的包装器。我已经尝试过所有类型的同步技术,例如 ReaderWriterLockSlim 和 Web 上的其他帖子,但结果是一样的。我避免使用 ReaderWriterLockSlim,因为我的写入次数多于读取次数。

因为我无法控制由 WCF 生成的消费者和生产者线程,因为它们可以访问 Singleton Store。我无法实现 Web 上可用的生产者/消费者示例。以下是数据存储的示例代码。

0 投票
2 回答
169 浏览

java - 消费者池的自动扩展

我们有一个 Web 应用程序,可以让用户触发对外部资源的请求。外部资源花费未指定的时间来收集结果,因此我们必须轮询它以获取更新,并在完成后收集最终结果。

我们希望这样当用户触发请求时,它会被添加到队列中,然后许多工作线程将接收每个请求并进行轮询,而用户则执行其他操作。

由于一天中的请求数量变化很大,我们认为让大量工作人员在速度很慢时什么都不做会浪费资源,但同时我们需要有足够的工作人员来处理峰值负载系统。

我们希望可以在有大量请求等待时添加更多工作人员,但在无事可做时杀死工作人员。

使用 EJB 可以/可以做到这一点,但我们不想使用它。我们也不想使用 JMS 或其他大型框架来处理这个问题,除非它是我们已经在使用的框架(Spring、Quartz、很多 Apache 的东西)。

由于 EJB 对此提供支持,并且它是那里发现的更有用的特性之一,我们想象有人已经为我们解决了这个问题。建议?

0 投票
2 回答
3729 浏览

c - 使用循环缓冲区同步生产者和消费者

我有一个生产者和一个消费者。生产者在给定的共享内存区域上写入固定大小的项目,消费者检索它们。

生产者可能比消费者明显慢或快,随机的。

我们想要的是

  1. 如果生产者的运行速度比消费者快,当它填充循环缓冲区时,它会继续写入最旧的帧(当然,除了消费者正在消费的帧 - 我强调这一点,生产者和消费者必须同步解决方案,因为它们是不相关的过程)。

  2. 相反,如果消费者比生产者快,它必须等待一个新的帧并在它在那里时消费它。

我找到了带有循环缓冲区的生产者/消费者的实现,但只有那些不尊重第一个请求的实现(即,如果循环缓冲区已满,它们会等待消费者完成,而我想要的是覆盖最旧的帧)。

我不想推出自己的(容易出现错误)解决方案,而是使用预先罐装的、经过测试的解决方案。有人可以指出一个好的 C 实现吗?(C++ 也可以)。

非常感谢。