LINUX.ORG.RU

уже в понедельник голова не работает; нужна подсказка

 ,


0

2

какие различия в коде который создает треды? кроме того что 1й код работает, так еще в консоли есть строки «in thread block», а после выполнения второго кода этих строк нету

где я туплю?

require 'thread'
class Pool
    def initialize(size)
        @size = size
        @jobs = Queue.new

        @pool = Array.new(@size) do |i|
            print "in array loop\n"
            Thread.new do
                print "in thread block\n"
                Thread.current[:id] = i

                catch(:exit) do
                    loop do
                        job, args = @jobs.pop
                        job.call(*args)
                    end
                end
            end
        end
    end

    def schedule(*args, &block)
        @jobs << [block, args]
    end

    def shutdown
        @size.times do
            schedule { throw :exit }
        end

        @pool.map(&:join)
    end
end

p = Pool.new(2)

20.times do |i|
    p.schedule do
        sleep rand(4) + 2
        puts "Job #{i} finished by thread #{Thread.current[:id]}"
    end
end

at_exit { p.shutdown }

#!/usr/bin/env ruby
require 'thread'
2.times do |i|
    print "in array loop\n"
    Thread.new do
        print "in thread block\n"
        #Thread.abort_on_exception = true
        #Thread.current['id'] = i
        #Thread.current['count'] = 0

        while true do
            print 'thread:'+i.to_s
        end
    end
end
★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от vladimir-vg

если не чего сказать по делу, то можеш идти заниматся скородрочерством в другом треде^Wместе

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

Это совершенно по делу. В Ruby среде есть общепринятый стиль к которому все привыкли. То что вы запостили неудобно читать.

vladimir-vg ★★
()
Ответ на: комментарий от vladimir-vg

специально для тебя

require 'thread'
class Pool
  def initialize(size)
    @size = size
    @jobs = Queue.new

    @pool = Array.new(@size) do |i|
      print "in array loop\n"
      Thread.new do
        print "in thread block\n"
        Thread.current[:id] = i

        catch(:exit) do
          loop do
            job, args = @jobs.pop
            job.call(*args)
          end
        end
      end
    end
  end

  def schedule(*args, &block)
    @jobs << [block, args]
  end

  def shutdown
    @size.times do
      schedule { throw :exit }
    end

    @pool.map(&:join)
  end
end

p = Pool.new(2)
#!/usr/bin/env ruby
require 'thread'
2.times do |i|
  print "in array loop\n"
  Thread.new do
    print "in thread block\n"
    #Thread.abort_on_exception = true
    #Thread.current['id'] = i
    #Thread.current['count'] = 0

    while true do
      print 'thread:'+i.to_s
    end
  end
end
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

О нет, мои глаза. Пожалуйста, я вас очень прошу, перед тем, как писать что-нибудь на Ruby еще раз, ознакомьтесь с https://github.com/bbatsov/ruby-style-guide/ И дело тут не только в количестве пробелов.

А касательно тредов, то во втором случае программа просто завершается быстрее, чем треды начинают выполняться.

2.times do |i|
  puts 'in array loop'
  Thread.new do 
    puts 'in thread loop'

    while true do 
      puts "thread: #{i.to_s}"
    end

  end
end

sleep 7 

Thread.list.each do |t|
  p t
end
Anatolik ★★
()
Ответ на: комментарий от Anatolik

Я и сам только что с удовольствием освежил память. Вот так красивее:

2.times do |i|
  puts 'in array loop'
  Thread.new do 
    puts 'in thread loop'
    puts "thread: #{i.to_s}" while true
  end
end

sleep 7 

Thread.list.each { |t| p t }

Anatolik ★★
()
Ответ на: комментарий от Anatolik

Спасибо за советы. По проблеме: буду дома - посмотрю как использовать ваш hint

Относительно codestyle. многосторчный while «мигрировал» с основной версии кода. print вместо puts я использовал потому что гдето прочитал что puts это на самом деле вызов 2х функций print (2я с '\n'), а потому это может дезориентиеровать когда же на самом деле был выполнен puts.

Код, который я пишу, возможно будет переписан на Python (и возможно не мной). Поэтому стараюсь использовать как можно меньше «рубизмов».

offtop: если у меня будут еще какие то заминки с кодом, можна вас кастовать через тег user?

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB
                    end
                end
            end
        end
    end

(оставлю это тут чтобы использовать в срачах с противниками отступов :))

true_admin ★★★★★
()
Ответ на: комментарий от ZuBB

print вместо puts я использовал потому что гдето прочитал что puts это на самом деле вызов 2х функций print (2я с '\n'),

Так и есть. Это просто синтаксический сахар, который улучшает читаемость и уменьшает время написания кода.

а потому это может дезориентиеровать когда же на самом деле был выполнен puts.

Однако, мне не совсем ясно, в каких случаях это может дезориентировать.

Код, который я пишу, возможно будет переписан на Python (и возможно не мной). Поэтому стараюсь использовать как можно меньше «рубизмов».

Может быть, тогда имеет смысл изначально использовать Python? Для меня это прозвучало как «Сейчас я хожу на обычный пляж, но, возможно, вскоре буду ходить на нудистский. Поэтому на обычный стараюсь ходить голышом.»

offtop: если у меня будут еще какие то заминки с кодом, можна вас кастовать через тег user?

Конечно. Я не экперт, но мне будет интересно помочь вам разобраться в проблеме.

Anatolik ★★
()
Ответ на: комментарий от Anatolik

Может быть, тогда имеет смысл изначально использовать Python?

изначально имело. а сейчас, когда написано более половины (или еще больше)..

ZuBB ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.