我正在与Celluloid编写并发应用程序,并且对期货和Actor的适当销毁/终止有疑问。我有一个这样创建的队列:
<s:select label="What's your favor search engine"
headerKey="-1" headerValue="Select Search Engines"
list="searchEngine"
name="yourSearchEngine" />
ArrayThread只是一个包含赛璐oid的数组:
Celluloid::Actor[:input_queue] = ArrayThread.new()
在程序运行时,将创建包含对象的线程,并将其压入上述input_queue,如下所示:
class ArrayThread < Array
include Celluloid
def initialize(arr=[])
super(arr)
end
end
Kob类包括赛璐oid,并且包含一个process()方法,该方法执行大量操作,这需要一些时间。目标是能够创建尽可能多的内存/ CPU允许的事物,并使它们同时进行处理。
所有这些都工作正常,并且基于资源,将input_queue的代码限制为固定长度。另一个线程应该从input_queue中提取项目,对其进行处理,然后将其中的一些项目推入一个单独的队列中,以便稍后由第三个线程进一步处理。
现在是我的问题,那些没有被压入第二个队列的对象需要销毁。这是我目前执行此操作的代码:
k = Kob.new(path.chomp)
Celluloid::Actor[:input_queue].push({:obj => k, :future => k.future(:process)})
确定k是保留还是销毁。如果它需要走,那么...
k = Celluloid::Actor[:input_queue].shift
我不确信自己做对了,并担心这里的内存泄漏。我该如何验证?我在IRB中玩过,但是ObjectSpace数据似乎没有改变。我什至尝试手动调用垃圾回收,但这似乎也没有任何效果。有人可以启发我吗?