非阻塞命名管道

Posted

技术标签:

【中文标题】非阻塞命名管道【英文标题】:Non-blocking named pipes 【发布时间】:2011-03-15 19:44:55 【问题描述】:

问题摘要:我已经设法大大加快了上传图片时的翻阅速度,但代价是使用并发性。现在我需要针对竞争条件保护该并发性。我打算让依赖脚本轮询正常文件以了解独立脚本的状态,但后来决定命名管道会更好。管道以避免轮询和命名,因为我无法从打开它们的脚本中获取 PID(这是我需要使用管道与之交谈的那个)。

因此,当上传图像时,客户端通过 AJAX 将 POST 发送到脚本,该脚本 1) 保存图像 2) 生成并行脚本(独立的)来拇指图像和 3) 将有关图像的 JSON 返回到客户。然后客户端立即请求缩略图版本,我们希望在发送响应时有足够的时间准备。但如果它没有准备好,Apache mod_rewrites 路径指向第二个脚本(依赖),等待翻阅完成,然后返回图像数据。

我希望这会相当简单,但是,在通过终端单独测试独立脚本时,我得到了这个:

$ php -f thumb.php -- img=3g1pad.jpg
successSegmentation fault

来源在这里:http://codepad.org/JP9wkuba 我怀疑我遇到了段错误,因为我创建的那个 fifo 仍然是打开的,现在是孤立的。但是我需要它让依赖脚本看到,对吧?它不应该是非阻塞的吗?我想这是因为脚本的其余部分可以运行....但它无法完成?正如我一开始所想的那样,这将是一个普通文件的工作,除非两者都打开,我不想进行轮询。我想最多轮询一次并完成它。我只需要投票并忽略丑陋吗?

【问题讨论】:

我知道这不会直接回答你的问题,但你为什么选择这条令人难以置信的奇怪路线而不是使用work/message queue like Gearman? @Charles:嗯,我听说过,但不知道具体是做什么的。但我现在真的不需要其他 API 来学习。 你需要担心的 2-4 种方法与从你发现自己陷入的崩溃命名管道泥潭中挖掘自己所需的努力相比是微不足道的。:) Gearman 甚至让您send status data back while processing,您似乎在这里有一个很好的案例。 (发回状态信息实际上显着增加了作业检索过程的复杂性——它从触发后忘记/触发并等待到触发并循环同时处理标志。) 同意,gearman 值得一看,或者 php-resque 对你来说可能更简单一些(两者都成功使用) @FractalizeR,我发现“这样做,你疯了”并不总是能像实际的 answer 那样顺利,尽管它适用于这个案例。毕竟我可能会做一个答案转换。 【参考方案1】:

您需要删除创建的 FIFO 文件,然后完成所有脚本。

【讨论】:

以上是关于非阻塞命名管道的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信--FIFO(命名管道)

[linux] 详解linux进程间通信

[linux] 详解linux进程间通信

如何等待 n 秒以打开命名管道?

如何解除阻塞已删除命名管道上的线程阻塞?

Linux:打开命名管道进行写入时超时