【发布时间】:2019-11-15 12:27:24
【问题描述】:
我写了一个程序,一个水晶程序,用 Sieve 计算一个范围内的素数。
代码
#!/usr/bin/env crystal
def sieve(max)
t = Thread.new do
dot, ary, colours = ".", ["\xE2\xA0\x81", "\xE2\xA0\x88", "\xE2\xA0\xA0", "\xE2\xA0\x84"] * 2, [154, 184, 208, 203, 198, 164, 129, 92]
print "\e[?25l"
loop do
ary.size.times do |x|
print("\e[2K#{ary[x]} \e[38;5;#{colours[x]}mPlease Wait#{dot * x}\e[0m\r")
sleep(0.1)
end
end
end
s = [nil, nil] + (2..max).to_a
s.each do |x|
next unless x
break if (sq = x ** 2) > max
(sq..max).step(x) { |y| s[y] = nil }
end
puts "\e[?25h"
s.tap { |x| x.compact! }
end
p sieve(2_000_000).size
我想显示的方式是
问题
问题是当 puts 写筛子时线程没有被杀死。方法 sieve(n) 只返回一个数组。然后计算并打印数组大小。您可以看到动画冻结了一段时间,然后继续,直到它被打印并退出。如果我使用spawn do...end,则 spawn 中的打印会暂停,直到计算出筛子。
我以前用红宝石做
t = Thread.new { loop while ... }
<some other time consuming stuff here>
t.kill
return calculated_stuffs
水晶细节
水晶 0.31.1 (2019-10-21)
LLVM:9.0.0 默认目标:x86_64-pc-linux-gnu
如何杀死水晶中的线程?
【问题讨论】:
-
您可以添加一个布尔值“keep_running”或可以向该线程发送消息的通道,例如“停止运行”并每隔一段时间对其进行轮询,FWIW...
标签: multithreading crystal-lang