質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

670閲覧

rubyのThreadで大量のIntergerを渡すと固まる

ayu

総合スコア212

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2017/07/12 05:57

こんにちは。

rubyのThreadsで色々と実験しています。

固まることが多いのですが、これはなぜですか?

ruby

1class Slack 2 def initialize(names) 3 @names = names 4 end 5 6 def list 7 threads = [] 8 @names.each do |name| 9 threads << Thread.new do 10 3.times do |i| 11 puts "#{name}:#{i}" 12 end 13 end 14 end 15 threads.each { |t| t.join } 16 end 17end 18 19names = %w(foo bar baz) 20Slack.new(names).list 21=> 22baz:0 23baz:1 24baz:2 25bar:0 26foo:0 27foo:1 28foo:2 29bar:1 30bar:2

こちらはうまくいきます。

Slack.new([*1..10000]).list => can't create Thread: Resource temporarily unavailable (ThreadError)

大量の処理をさせたいのに、エラーになってしまいます。

threadsを10,000個作成しているのは多すぎなのでしょうか?

その場合、上限値はどこを見て判別するのでしょうか?

よろしければ教えてくださいm(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スレッド数の限界はRubyではなく実行環境依存です。OSおよびOSの設定によって最大スレッド数が決まっており、それを越えて作成するとエラーになります。以下一般的なLinuxの場合について、確認すべき所を記述します。OSによっては調べるところが異なりますので、ご注意ください。

  1. /proc/sys/kernel/threads-maxの値を確認してください。それが、システム全体の最大スレッド数です。sysctl -w kernel.threads-max=XXで数値を上書きするか、起動時の値は/etc/sysctl.confで設定できます。
  2. ulimit -aの結果を確認してください。色々制限値がありますが、そのどれかが引っかかっている可能性があります。

なお、私の手元(Mingw64版Ruby、Bash on Ubuntu on Windows版Ruby、CentOS版Ruby)で試す限り、エラーになりませんでした。

投稿2017/07/12 10:40

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2017/07/15 06:22

raccyさん 返事が遅くなりましたが、ありがとうございました! 実行するOSに依存するものだったのですね。 言われてみると、threadは言語機能ではなく、OS側の機能を使っていますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問