问题标签 [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 投票
6 回答
3969 浏览

c++ - 如何使用 POSIX 线程实现阻塞读取

我想实现一个生产者/消费者场景,该场景遵循大致如下的接口:

在这种情况下,feedandrun将在单独的线程上运行,并且read应该是阻塞读取(如recvand fread)。显然,我需要在我的双端队列上进行某种互斥,并且我需要某种通知系统来通知read重试。

我听说条件变量是要走的路,但我所有的多线程体验都在 Windows 上,我很难理解它们。

谢谢你的帮助!

(是的,我知道返回向量是低效的。我们不要讨论这个。)

0 投票
2 回答
502 浏览

producer-consumer - 生产者完成后通知消费者

我正在从 ldap 读取大量数据,这些数据需要与数据库中的相应记录进行比较。为了尽量减少 SQL 查询的数量,我想将多个 ldap 记录批处理到一个查询中。

所有这一切都非常简单:一个产生 ldap 结果的线程,以及一个使用这些结果并运行 SQL 查询的线程。

问题是:如果 ldap 只返回 3 个结果并且buffer_size是 5 个结果,它将永远阻塞。我意识到我可以将一些特殊的标记放入缓冲区中,例如None, 或"EOF",但这似乎是一个糟糕的设计:“迭代直到你完成,哦,除非你看到这个特殊值,这意味着你也完成了”。

我想出了两个替代的想法。首先是有一个共享eof变量,但我不知道如何正确同步它。

第二个是ProduceChunks(chunk_size)为生产者提供一个方法,它会处理结果的批处理,但我不喜欢这样,因为它假设生产者知道如何最好地缓冲结果,而实际上,我认为是消费者的责任。

有没有人有任何指导?

0 投票
3 回答
2006 浏览

java - BlockingQueue:put() 和 isEmpty() 不能一起工作?

我想要一个SynchronousQueue从一个线程插入元素的地方put(),所以输入被阻塞,直到元素被另一个线程接收。

在另一个线程中,我执行大量计算,并且不时想要检查一个元素是否已经可用,并使用它。但似乎isEmpty()总是返回 true,即使另一个线程正在等待put()调用。

这怎么可能?这是示例代码:

编辑: isEmpty() 和 peek() 都不起作用,必须使用 poll()。谢谢!

0 投票
5 回答
3000 浏览

multithreading - 读写器问题

对不起,如果我再次问同样的问题但想验证!

我有两个进程 P1 和 P2。

P1是作家(制片人)。
P2是一个读者(消费者)。

有一些共享内存或 P1 写入的文件,一旦 P1 写入,应该通知 P2 读取。

现在根据我的理解 P1 的伪代码应该是

现在在P2

问题:

  1. 阅读器是否需要锁?阅读器只会读取文件而不更改它。所以我想读者不需要锁。想法?在没有锁的情况下会出错吗?
  2. 我每次在读写过程中都会打开和关闭文件的句柄。我认为这不是必需的。我可以在构造函数中打开文件句柄并在读写器的析构函数中关闭它。但是当它被用于写作时,我可以从文件中读取吗?

编辑:每次 writer 在 File 末尾写入 10 个字节,并且 reader 应该读取 writer 写入的最新 10 个字节。

0 投票
1 回答
21041 浏览

c# - 在 C# 中实现生产者/消费者模式

如何使用Events 和 Delegates在 C# 中实现生产者/消费者模式?在使用这些设计模式时,我需要注意哪些资源?有没有我需要注意的边缘情况?

0 投票
1 回答
1477 浏览

objective-c - 如何在从 NSMutableData 读取的 NSInputStream 上发出 NSStreamEventEndEncountered 信号

在 Cocoa 中,我设置了两个 NSThread,一个生产者和一个消费者。生产者将数据附加到 NSMutableData,接收者从该数据中打开一个 NSInputStream 并以块的形式读取。

生产者线程的写入速度比消费者进程快很多,这没关系。但是生产者只生产有限数量的工作,然后退出。我想让消费者线程处理 NSStreamEventEndEncountered 事件。当 NSInputStream 来自 NSMutableData 时,我该如何发出信号?

我是否应该让生产者发送一系列带有表示流结束的神奇数字的字节?

0 投票
2 回答
6318 浏览

java - Java线程等待和通知

我有两个线程。线程 A 正在从队列中提取一些元素,线程 B 正在向队列中添加一些元素。

当队列为空时,我希望线程 A 进入睡眠状态。

当线程 B 向队列中添加一些元素时,它应该确保线程 A 正在工作。如何在 Java 中做到这一点?

0 投票
6 回答
3774 浏览

python - 这种 Python 生产者-消费者无锁方法是线程安全的吗?

我最近编写了一个使用简单生产者/消费者模式的程序。它最初有一个与不正确使用 threading.Lock 相关的错误,我最终修复了该错误。但这让我思考是否有可能以无锁的方式实现生产者/消费者模式。

我的要求很简单:

  • 一个生产者线程。
  • 一个消费者线程。
  • 队列只能放置一项。
  • 生产者可以在当前项目被消耗之前生产下一个项目。因此,当前项目丢失了,但这对我来说没关系。
  • 消费者可以在生产下一个项目之前消费当前项目。因此,当前项目被消耗了两次(或更多),但这对我来说没关系。

所以我写了这个:

我的问题是:这段代码是线程安全的吗?

立即评论:这段代码并不是真正无锁的——我使用 CPython,它有 GIL。

我对代码进行了一些测试,它似乎可以工作。它转换为一些由于 GIL 而具有原子性的 LOAD 和 STORE 操作。但我也知道当 x 实现方法del x时操作不是原子的。__del__因此,如果我的项目有一个__del__方法并且发生了一些令人讨厌的调度,事情可能会中断。或不?

另一个问题是:我必须施加什么样的限制(例如对生产项目的类型)才能使上述代码正常工作?

我的问题只是关于利用 CPython 和 GIL 的怪癖以提出无锁(即没有像 threading.Lock 这样的锁在代码中显式)解决方案的理论可能性。

0 投票
2 回答
1304 浏览

c# - 线程安全的异步字节队列

我有一个回调方法,只要有新数据可用就会调用它:

我想将它包装在一个实现类似于此的接口的类中:

这显然是一个经典的生产者-消费者问题:字节是通过调用回调方法产生的,并由 Begin/EndRead 和 Read 方法消耗。如果没有数据可用,Begin/EndRead 和 Read 方法应该阻塞(直到发生超时)。实现应该使用固定大小的内部缓冲区,因此当缓冲区当前已满时,回调方法需要阻塞。

由于考虑多线程通常会导致严重的头痛,所以我的问题是:是否已经实现了这种数据结构?

(我认为实现 Read 方法应该很简单,但我想避免使用 Read./ 实现 Begin/EndRead BeginEndInvoke

0 投票
3 回答
5297 浏览

c# - 通用 .Net 生产者/消费者

我正在玩弄在 C# 中实现通用生产者/消费者对 + 处理队列的想法,以获得乐趣。这个想法是您可以创建实现适当 IProducer 和 IConsumer 接口(提供的默认实现)的对象,这些接口主要由委托组成,将它们传递给QueueProcessor类实例,告诉它您想要多少消费者,然后去。

但我对自己说:“我自己,这肯定以前做过。”

那么有谁知道 C# 中生产者/消费者模式的良好通用实现(VB.Net 也可以)?我正在寻找的基本要求:

  • 对生产和消费类型(输入、排队任务和输出类型,或它们的任何组合)使用泛型
  • 允许您指定有多少消费者将在队列中工作
  • 允许您将多个队列链接或链接到管道中(我知道多个消费者很棘手)
  • 允许您实现自己的生产者和消费者
  • 允许您将任何 IEnumerable 转换为生产者(如果我必须自己实现,可以,只要可能)
  • 基于委托(您可以使用 lambda 语法进行基本的消费者或生产者工作来处理单个项目)

或者如果没有,是什么陷阱阻止了它,你对如何实现它有什么想法吗?