【问题标题】:Crystal lang fiber and web socketCrystal lang 光纤和网络插座
【发布时间】:2026-02-03 15:15:01
【问题描述】:

我是水晶初学者。 我有问题,也许有人可以帮助我。

我使用 Kemal 框架。 有这个代码:

require "kemal"
require "json"

channel = Channel(Card).new

post "/posts" do |env|
  json = JSON.parse(env.request.body as String)

  url = json["url"].to_s

  spawn do
    # Slow process
    page = Scraper.new(url)
    channel.send(page)
  end

  {"url" => url}.to_json
end

ws "/" do |socket|
  data = channel.receive
  socket.send data.to_h.to_json
end

Kemal.run

但是结果只发送到 web socket 一次。

(仅在第一次发布请求之后)

我该如何解决?

【问题讨论】:

    标签: concurrency websocket crystal-lang kemal


    【解决方案1】:

    我不是 kemal 专家,我不知道您的预期行为是什么,但是如果您想在每次有人发布到“/posts”时向 websocket 发送一条消息,我会创建一个循环:

    while data = channel.receive?
      socket.send(data.to_h.to_json)
    end
    

    【讨论】:

    • 否则我认为当块完成时websocket连接已关闭