我正在尝试实施一个拥有生产者和N(N> = 1)工人的程序。它们使用消息队列进行通信。 这个想法是生产者向队列发送“任务”。工作人员执行msgrcv()调用以获取任务并执行一些代码。在工作人员完成任务之后,它将计算结果发送到队列。制作人将收到此消息并保存结果。
我正在使用POSIX消息队列,生产者和工作人员同时工作。
这个程序背后的问题是存在危及通信的场景。 每条消息的大小约为5000字节。在UNIX系统中,最大队列大小约为16000字节,就是这种情况。
场景是:队列中有3个任务(5000 * 3 = 15000字节)。一些工作者从队列中获取一条消息(现在队列有10000字节)。工作人员开始执行任务,由于工作人员必须在每个任务中处理的字节数,生产者向队列发送另一条消息(队列现已满)。 现在任务完成后,工作人员尝试将结果发送到队列并被阻止(队列已满)。生产者尝试将另一个任务发送到队列并被阻止。
如果我只用一名工人来运行这个程序,那么这种情况很有可能发生。
有没有人有想法避免这种情况?
答案 0 :(得分:1)
如果您无法更改队列大小,要使用的队列数或使用不同的排队API,那么排队较少的数据呢?
您可以将实际数据放在共享内存对象或临时文件中。然后,不是将数据放入消息中,而是将文件名或共享内存对象名称以及消息中的偏移量放入其中。然后,生产者流程可以在收到结果后进行清理。
它不一定必须是共享内存或临时文件,但其目的是将数据放在消息之外的其他位置,并在消息中包含其他进程访问它所需的任何信息。
答案 1 :(得分:0)
我要为客户端使用第二个消息队列 - >服务器响应或限制(#sent - #received)是一个安全号码。