【问题标题】:How do I allow concurrent access to the same route?如何允许并发访问同一路由?
【发布时间】:2013-12-30 21:28:40
【问题描述】:

我有一个简单的 Sinatra 应用程序,其中包含一条长时间运行的路线:

get '/jobs/new' do
  logger.info "jobs/new start. Thread = #{Thread.current.inspect}"
  sleep 10
  logger.info "end new..."
  erb :'jobs/new'
end

get '/jobs' do
  erb :'jobs/index'
end

我可以同时访问多个路由,但不能访问同一条路由。

一个例子是,当一个客户端调用/jobs/new(长时间访问)时,另一个客户端可以并行调用jobs。但是对同一条路线的并行调用不起作用。在这种情况下,网络服务器 Puma 总是使用同一个线程调用路由:

jobs/new started. Thread = #<Thread:0x007f42b128e600 run>
10 seconds later...
jobs/new ended. Thread = #<Thread:0x007f42b128e600 run>
jobs/new started. Thread = #<Thread:0x007f42b128e600 run> <-- new call. Has to wait till first has finished

另一个路由被不同的线程调用。在路线 1 运行时:

jobs/new started. Thread = #<Thread:0x007f42b128e600 run>
2 seconds later...
jobs started. Thread = #<Thread:0x007f541f581a40 run> <--other thread
8 seconds later...
jobs/new ended. Thread = #<Thread:0x007f42b128e600 run>
jobs/new started. Thread = #<Thread:0x007f42b128e600 run>

我尝试在线程模式下使用 Thin 和 Puma 以相同的行为运行应用程序

【问题讨论】:

  • 没有必要,也不建议在标题中添加关键字,除非它们是标题正常句子结构的一部分。搜索不使用诸如“Sinatra:”之类的关键字,它们也无助于问题的关键工作排名。相反,它们降低了标题的可读性。关键字和搜索基于您添加到问题的标签。

标签: ruby concurrency sinatra thin puma


【解决方案1】:

不管你做什么,我都觉得不对。

运行此代码:

# config.ru
require 'bundler'
Bundler.require

get '/jobs/new' do
  logger.info "jobs/new start. Thread = #{Thread.current.inspect}"
  sleep 10
  logger.info "end new..."
  "jobs/new"
end

run Sinatra::Application

与美洲狮:

Puma starting in single mode...
* Version 2.7.1, codename: Earl of Sandwich Partition
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:9292
Use Ctrl-C to stop
I, [2013-12-12T14:04:48.820907 #9686]  INFO -- : jobs/new start. Thread = #<Thread:0x007fa5667eb7c0 run>
I, [2013-12-12T14:04:50.282718 #9686]  INFO -- : jobs/new start. Thread = #<Thread:0x007fa566731e38 run>
I, [2013-12-12T14:04:58.821509 #9686]  INFO -- : end new...
127.0.0.1 - - [12/Dec/2013 14:04:58] "GET /jobs/new HTTP/1.1" 200 8 10.0132
I, [2013-12-12T14:05:00.283496 #9686]  INFO -- : end new...
127.0.0.1 - - [12/Dec/2013 14:05:00] "GET /jobs/new HTTP/1.1" 200 8 10.0015
^C- Gracefully stopping, waiting for requests to finish
- Goodbye

导致 2 个不同的线程!

【讨论】:

  • 是的,确实,当我调用从不同浏览器(FF、chrome)的路由时,调用是并发的。当我从同一个浏览器(不同的选项卡)调用它时,行为就像我在问题中的示例。为什么??
  • 浏览器好像禁止同时调用同一个url。
  • 在调试此类问题时不要使用浏览器。依赖命令行,使用wgetcurl
猜你喜欢
  • 2013-08-14
  • 2021-04-15
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多