我有一个使用FFI包装SO文件。我需要超时FFI电话,但不幸的是,在Timeout, System timeout & terminator not working for FFI based function中提到的任何常用方法都没有发生超时。有没有一些选项可以让通话超时?FFI块红宝石线程和任何时候不能放置FFI调用块
感谢您的建议提前。
我有一个使用FFI包装SO文件。我需要超时FFI电话,但不幸的是,在Timeout, System timeout & terminator not working for FFI based function中提到的任何常用方法都没有发生超时。有没有一些选项可以让通话超时?FFI块红宝石线程和任何时候不能放置FFI调用块
感谢您的建议提前。
最好的解决方案是使用没有GIL(全局解释器锁)的ruby运行时(如JRuby) - 它应该正确处理中断阻塞的FFI调用。
在其他ruby运行时,为了使本机通话可以中断,您需要将该功能标记为“阻塞”功能--FFI将在调用此功能时解锁GIL,并将其设置为中断。
例如
require 'ffi'
module Sleep
extend FFI::Library
ffi_lib FFI::Library::LIBC
# Tell FFI that this function may block
@blocking = true
attach_function :sleep, [:uint], :void
end
@blocking不粘 - 您需要在每个'attach_function'调用之前将其设置为标记为阻塞。
而且它不是100%肯定的解决方案。中断在本地代码中被阻塞的函数通常适用于可中断的函数(例如睡眠,读取,写入等),但不适用于某些本地代码(例如,cpu密集型计算,可能还有许多其他类型)。
我没有测试这一点,但通过在FFI库library.rb该编码判断,这应该是上述一个更好的替代方案:
require 'ffi'
module Sleep
extend FFI::Library
ffi_lib FFI::Library::LIBC
attach_function :sleep, [:uint], :void, :blocking => true
end
为什么downvote? –
** DO NOT **设置私有像这样的FFI内的实例变量。相反,对[attach_function]使用':blocking'选项(http://rdoc.info/gems/ffi/FFI/Library:attach_function)。 – SFEley