标签: kemal

如何释放为Crystal中的某些结构分配的内存 - 手动?

我有一个基于Kemal的RESTful Web服务,返回"非常大"(大小从10到17M)的JSON数据块,这是由"大"Hash结构的to_json方法生成的.

根据GC警告消息,我的代码"可能导致内存泄漏",我自己的测量显示内存在应用程序运行时"泄漏".

所以,我认为,释放为Hash分配的内存并且手动使用JSON字符串表示会很好,但我不知道如何做到这一点:我用无法记录的GC.free方法进行的实验并不成功,我不知道我知道继续调查的方向......

请告诉我,我该怎么做才能避免内存泄漏?

您可以查看我非常简单的应用程序的非常新鲜但通常是实际版本(实际上它是在封闭的公司网络部分内部开发的)https://github.com/DRVTiny/Druid/blob/master /src/druid_mp.cr

导致内存泄漏的代码:

get "/service/:serviceid" do |env|
        if (svcid = env.params.url["serviceid"]) && svcid.is_a?(String) && svcid =~ /^s?\d+$/
          druid.svc_branch_get((svcid[0] == 's' ? svcid[1..-1] : svcid).to_i).to_json
        else
          halt env, status_code: 404, response: %q({"error": "Wrong service identificator"})
        end
  rescue ex
        halt env, status_code: 503, response: {"error": "Unhandled exception #{ex.message}"}.to_json
  end
Run Code Online (Sandbox Code Playgroud)

PS我在每个用户请求后插入了执行GC.collect的after_all钩子.不知道,也许这可以解决我的问题(但我认为这根本不是正确的方法).

UPD:在我将GC.collect添加到after_all Kemal钩子后 - 内存泄漏消失了.但是全局GC.collect可能太慢了,据我所知,它会阻塞所有光纤和socket.accept().如果我弄错了,请告诉我.

memory-leaks crystal-lang kemal

6
推荐指数
1
解决办法
186
查看次数

在生产模式下启动水晶

我一直在运行我的Crystal webapp,通过构建它,然后运行可执行文件.但是,它总是侦听端口3000.

如何在80和443上构建/运行Crystal Web应用程序?

我也在使用凯末尔.这是我的示例应用程序.

require "kemal"

get "/" do
  "Hello World!"
end

Kemal.run
Run Code Online (Sandbox Code Playgroud)

建造:

crystal build src/myapp.cr
Run Code Online (Sandbox Code Playgroud)

运行:

./myapp
Run Code Online (Sandbox Code Playgroud)

crystal-lang kemal

5
推荐指数
1
解决办法
251
查看次数

在没有 IO 的情况下在光纤之间循环

据我所知,水晶会通过 io 循环光纤,这意味着如果一根光纤正在等待 io,水晶将切换到另一根光纤。

如果我们生成两个纤程,但其中一个在没有 io 的情况下进行持续计算/循环,该怎么办?

例如,使用下面的代码,服务器不会响应任何 http 请求

spawn do
  Kemal.run
end

spawn do
  # constant computation/loop with no IO
  some_func
end

Fiber.yield
# or sleep
Run Code Online (Sandbox Code Playgroud)

parallel-processing concurrency crystal-lang kemal

5
推荐指数
1
解决办法
283
查看次数

使用块的Kemal配置

Kemal目前允许通过以下方式设置配置选项

Kemal.config.env = "development" Kemal.config.port = "3456"

我想做一个像块一样的事情:

configuration do |config| config.env = "development" config.port = "3456" ... end

这甚至可能吗?
感谢您的任何见解.

crystal-lang kemal

2
推荐指数
1
解决办法
58
查看次数