【发布时间】:2012-06-05 04:17:17
【问题描述】:
我的服务器上运行着一个守护进程的 ruby 脚本,如下所示:
@server = TCPServer.open(61101)
loop do
@thr = Thread.new(@server.accept) do |sock|
Thread.current[:myArrayOfHashes] = [] # hashes containing attributes of myObject
SystemTimer.timeout_after(5) do
Thread.current[:string] = sock.gets
sock.close
# parse the string and load the data into myArrayOfHashes
Myobject.transaction do # Update the myObjects Table
Thread.current[:myArrayOfHashes].each do |h|
Thread.current[:newMyObject] = Myobject.new
# load up the new object with data
Thread.current[:newMyObject].save
end
end
end
end
@thr.join
end
此服务器接收和管理我的 rails 应用程序的数据,该应用程序都在 Mac OS 10.6 上运行。客户端在 15 日每 15 分钟调用一次服务器,而我目前只有 16 个左右的客户端在 15 日每 15 分钟调用一次,我想知道以下几点:
- 如果两个客户端在足够近的时间同时调用,一个客户端的连接尝试会失败吗?
- 如何确定我的服务器可以同时容纳多少个客户端连接?
- 如何监控我的服务器使用了多少内存?
另外,有没有一篇你可以指点我的文章来讨论实现这种服务器的最佳方法?我的意思是我可以让多个服务器实例监听同一个端口吗?那会有帮助吗?
我正在使用 Bluepill 来监控我的服务器守护进程。
【问题讨论】:
-
好奇:如果你之后只使用
join,为什么还要使用Thread.new?这相当于sock = @server.accept,然后只是删除所有对线程的引用。 -
我认为真正的答案是我可能不知道自己在做什么。我所知道的是@thr.join 使一切都开始可靠地工作。我会用中间的代码更新我的帖子,让你也许能够说出我的理解差距在哪里。
-
如果您使用
Thread.new而不是join,那么是的,如果您的代码不是线程安全的,那可能会很奇怪。不过,您更安全,但只需删除所有Thread引用;像这样:http://pastebin.com/8m6CnbU4. -
这种方法绝对不适合我。从我在线程上所做的搜索以及不同的系统如何以不同的方式处理它们,我不确定为什么会这样,但是我在 Mac OS 上运行并且我很清楚(从我的数据库中看到的结果)当我刚刚有一个简单的
sock=@server.accept时,变量在我的线程中变得混乱。所以真的我只是不确定@thr.join 到底在做什么。问题是在我有 @thr.join 之前,很多线程根本不会完成。如果没有@thr.join,我将如何解决这个问题? -
好吧……好吧,我明白了。不过,使用线程并没有真正的优势,因为无论何时使用
@thr.join都会同步它们。我建议您检查一下您正在尝试做的事情。
标签: ruby