2011-11-20 94 views
3

我试图实现一个有生产者和N(N> = 1)个工人的程序。他们使用消息队列进行通信。 这个想法是生产者发送队列“任务”。工作人员通过msgrcv()调用来获取任务并执行一些代码。在工作人员完成任务之后,它将计算结果发送到队列。制片人会收到此讯息并保存结果。在进程之间同步消息队列

我正在使用POSIX消息队列,并且生产者和工作者同时工作。

这个程序背后的问题是存在一个危及通信的场景。 每条消息的大小约为5000字节。在UNIX系统中,最大队列大小为〜16000字节。

该场景是:队列中有3个任务(5000 * 3 = 15000字节)。某些工作人员从队列中获取一条消息(现在该队列有10000个字节)。工作人员开始执行任务,并且由于工作人员必须在每个任务中处理的字节数量,生产者会向队列发送另一条消息(队列现在已满)。 现在任务完成后,工作人员尝试将结果发送到队列并被阻塞(队列已满)。生产者试图将另一个任务发送到队列并被阻塞。

如果我只用一个工人运行这个程序,这种情况发生的可能性很大。

有没有人有一个想法,以避免这种情况?

+0

我会考虑使用没有这些限制的消息排队机制,而不是使用某些看起来根本不适合您的用例的东西。 (除非你很难要求使用POSIX MQ)。也许ZeroMQ--我相信它可以作为一个轻量级嵌入式库。 – millimoose

+0

谢谢你的快速回答。是的,在这种情况下,我必须使用POSIX MQ。 –

+0

在一个程序或多个进程中使用多个线程吗? – Dmitri

回答

1

如果您无法更改队列大小,要使用的队列数量或使用不同的排队API,那么排队较少的数据又如何呢?

您可以将实际数据放在共享内存对象或临时文件中。然后,而不是将数据放入消息中,而是将消息中的文件名或共享内存对象名称以及可能的偏移量。生产者过程可以在收到结果后进行清理。

它不一定是共享内存或临时文件,但是想法是将数据放在消息以外的地方,并在消息中包含任何其他进程访问它所需的信息。

+0

嗨德米特里, 这就是我现在要做的。我会将数据放入共享内存中以排列较少的数据。处理文件与共享内存相比总是很慢。感谢所有帮助 –

0

我会为客户端 - >服务器响应或限制(#发送 - #接收)使用第二个消息队列是一个安全的数字。

+0

感谢您的答案。我只能使用一个消息队列。为了限制(#sent - #received),我需要知道队列中存在多少特定类型的消息(生产者 - >工作者或工作者 - >生产者),并且使用UNIX MQ,我无法知道这个消息。 –

+0

看不出为什么你不能跟踪制片人的任务(发送的任务 - 收到的结果)。 – themel

+0

嗨themel, 我可以跟踪(发送的任务 - 收到的结果)在生产者,但我现在会遵循德米特里的建议。 谢谢你的帮助:) –