问题标签 [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.
c++ - 如何使用 POSIX 线程实现阻塞读取
我想实现一个生产者/消费者场景,该场景遵循大致如下的接口:
在这种情况下,feed
andrun
将在单独的线程上运行,并且read
应该是阻塞读取(如recv
and fread
)。显然,我需要在我的双端队列上进行某种互斥,并且我需要某种通知系统来通知read
重试。
我听说条件变量是要走的路,但我所有的多线程体验都在 Windows 上,我很难理解它们。
谢谢你的帮助!
(是的,我知道返回向量是低效的。我们不要讨论这个。)
producer-consumer - 生产者完成后通知消费者
我正在从 ldap 读取大量数据,这些数据需要与数据库中的相应记录进行比较。为了尽量减少 SQL 查询的数量,我想将多个 ldap 记录批处理到一个查询中。
所有这一切都非常简单:一个产生 ldap 结果的线程,以及一个使用这些结果并运行 SQL 查询的线程。
问题是:如果 ldap 只返回 3 个结果并且buffer_size
是 5 个结果,它将永远阻塞。我意识到我可以将一些特殊的标记放入缓冲区中,例如None
, 或"EOF"
,但这似乎是一个糟糕的设计:“迭代直到你完成,哦,除非你看到这个特殊值,这意味着你也完成了”。
我想出了两个替代的想法。首先是有一个共享eof
变量,但我不知道如何正确同步它。
第二个是ProduceChunks(chunk_size)
为生产者提供一个方法,它会处理结果的批处理,但我不喜欢这样,因为它假设生产者知道如何最好地缓冲结果,而实际上,我认为是消费者的责任。
有没有人有任何指导?
java - BlockingQueue:put() 和 isEmpty() 不能一起工作?
我想要一个SynchronousQueue
从一个线程插入元素的地方put()
,所以输入被阻塞,直到元素被另一个线程接收。
在另一个线程中,我执行大量计算,并且不时想要检查一个元素是否已经可用,并使用它。但似乎isEmpty()
总是返回 true,即使另一个线程正在等待put()
调用。
这怎么可能?这是示例代码:
编辑: isEmpty() 和 peek() 都不起作用,必须使用 poll()。谢谢!
multithreading - 读写器问题
对不起,如果我再次问同样的问题但想验证!
我有两个进程 P1 和 P2。
P1是作家(制片人)。
P2是一个读者(消费者)。
有一些共享内存或 P1 写入的文件,一旦 P1 写入,应该通知 P2 读取。
现在根据我的理解 P1 的伪代码应该是
现在在P2
问题:
- 阅读器是否需要锁?阅读器只会读取文件而不更改它。所以我想读者不需要锁。想法?在没有锁的情况下会出错吗?
- 我每次在读写过程中都会打开和关闭文件的句柄。我认为这不是必需的。我可以在构造函数中打开文件句柄并在读写器的析构函数中关闭它。但是当它被用于写作时,我可以从文件中读取吗?
编辑:每次 writer 在 File 末尾写入 10 个字节,并且 reader 应该读取 writer 写入的最新 10 个字节。
c# - 在 C# 中实现生产者/消费者模式
如何使用Events 和 Delegates在 C# 中实现生产者/消费者模式?在使用这些设计模式时,我需要注意哪些资源?有没有我需要注意的边缘情况?
objective-c - 如何在从 NSMutableData 读取的 NSInputStream 上发出 NSStreamEventEndEncountered 信号
在 Cocoa 中,我设置了两个 NSThread,一个生产者和一个消费者。生产者将数据附加到 NSMutableData,接收者从该数据中打开一个 NSInputStream 并以块的形式读取。
生产者线程的写入速度比消费者进程快很多,这没关系。但是生产者只生产有限数量的工作,然后退出。我想让消费者线程处理 NSStreamEventEndEncountered 事件。当 NSInputStream 来自 NSMutableData 时,我该如何发出信号?
我是否应该让生产者发送一系列带有表示流结束的神奇数字的字节?
java - Java线程等待和通知
我有两个线程。线程 A 正在从队列中提取一些元素,线程 B 正在向队列中添加一些元素。
当队列为空时,我希望线程 A 进入睡眠状态。
当线程 B 向队列中添加一些元素时,它应该确保线程 A 正在工作。如何在 Java 中做到这一点?
python - 这种 Python 生产者-消费者无锁方法是线程安全的吗?
我最近编写了一个使用简单生产者/消费者模式的程序。它最初有一个与不正确使用 threading.Lock 相关的错误,我最终修复了该错误。但这让我思考是否有可能以无锁的方式实现生产者/消费者模式。
我的要求很简单:
- 一个生产者线程。
- 一个消费者线程。
- 队列只能放置一项。
- 生产者可以在当前项目被消耗之前生产下一个项目。因此,当前项目丢失了,但这对我来说没关系。
- 消费者可以在生产下一个项目之前消费当前项目。因此,当前项目被消耗了两次(或更多),但这对我来说没关系。
所以我写了这个:
我的问题是:这段代码是线程安全的吗?
立即评论:这段代码并不是真正无锁的——我使用 CPython,它有 GIL。
我对代码进行了一些测试,它似乎可以工作。它转换为一些由于 GIL 而具有原子性的 LOAD 和 STORE 操作。但我也知道当 x 实现方法del x
时操作不是原子的。__del__
因此,如果我的项目有一个__del__
方法并且发生了一些令人讨厌的调度,事情可能会中断。或不?
另一个问题是:我必须施加什么样的限制(例如对生产项目的类型)才能使上述代码正常工作?
我的问题只是关于利用 CPython 和 GIL 的怪癖以提出无锁(即没有像 threading.Lock 这样的锁在代码中显式)解决方案的理论可能性。
c# - 线程安全的异步字节队列
我有一个回调方法,只要有新数据可用就会调用它:
我想将它包装在一个实现类似于此的接口的类中:
这显然是一个经典的生产者-消费者问题:字节是通过调用回调方法产生的,并由 Begin/EndRead 和 Read 方法消耗。如果没有数据可用,Begin/EndRead 和 Read 方法应该阻塞(直到发生超时)。实现应该使用固定大小的内部缓冲区,因此当缓冲区当前已满时,回调方法需要阻塞。
由于考虑多线程通常会导致严重的头痛,所以我的问题是:是否已经实现了这种数据结构?
(我认为实现 Read 方法应该很简单,但我想避免使用 Read./ 实现 Begin/EndRead Begin
。EndInvoke
)
c# - 通用 .Net 生产者/消费者
我正在玩弄在 C# 中实现通用生产者/消费者对 + 处理队列的想法,以获得乐趣。这个想法是您可以创建实现适当 IProducer 和 IConsumer 接口(提供的默认实现)的对象,这些接口主要由委托组成,将它们传递给QueueProcessor
类实例,告诉它您想要多少消费者,然后去。
但我对自己说:“我自己,这肯定以前做过。”
那么有谁知道 C# 中生产者/消费者模式的良好通用实现(VB.Net 也可以)?我正在寻找的基本要求:
- 对生产和消费类型(输入、排队任务和输出类型,或它们的任何组合)使用泛型
- 允许您指定有多少消费者将在队列中工作
- 允许您将多个队列链接或链接到管道中(我知道多个消费者很棘手)
- 允许您实现自己的生产者和消费者
- 允许您将任何 IEnumerable 转换为生产者(如果我必须自己实现,可以,只要可能)
- 基于委托(您可以使用 lambda 语法进行基本的消费者或生产者工作来处理单个项目)
或者如果没有,是什么陷阱阻止了它,你对如何实现它有什么想法吗?