我正在使用Celluloid创建作业处理服务器。我拥有一个工作池,其中的工作人员从beanstalkd队列中获取任务,并使用
到目前为止,这个方法没有问题。使用反引号有什么不同呢?
Process.spawn
调用执行一个PHP脚本来处理一系列的工作。
这是我如何执行PHP命令的:
rout, wout = ::IO.pipe
pid = Process.spawn(cmd, :err=> :out, :out => wout)
_, exit_status = Process.wait2(pid)
wout.close
output = rout.readlines.join("\n")
这种方法“大多数”时间都有效。我做了几百个工作的测试,一切都进行得很好。但是当我将其投入生产时,某些PHP命令会无限期挂起。
如果我杀死挂起的进程并查看PHP命令写入的日志文件,最后一个日志消息可能是任何数量的看似随机不显眼的事件(也就是说,在挂起之前进程运行了多长时间我不能分辨出任何模式)。
处理作业的PHP脚本已经在生产中使用了几个月,但是在定期执行上。所以唯一改变的是它们现在是从这个新的作业处理器中执行的。
我是不是方法错了?Ruby是否会暂停/休眠进程或类似的事情- 我没有正确读取输出导致阻塞?
---编辑 ---
我切换到使用反引号操作符来执行命令(阻塞并不重要,因为Celluloid Actor是异步的):
output = `#{cmd}`
pid = $?.pid
exit_status = $?.exitstatus
到目前为止,这个方法没有问题。使用反引号有什么不同呢?