gpt4 book ai didi

multithreading - Crystal 将线程池背后的想法转换为 Fibers/spawn

转载 作者:行者123 更新时间:2023-12-04 09:30:44 24 4
gpt4 key购买 nike

我很难学习 Fibers\coroutines 背后的想法和 Crystal 中的实现。

我希望这是问这个问题的正确地方,我会完全接受“不在这里”的答案:)

这是我在 Ruby 中处理多线程的常用方法:

threads = []
max_threads = 10

loop do
begin
threads << Thread.new do
helper_method(1,2,3,4)
end
rescue Exception => e
puts "Error Starting thread"
end

begin
threads = threads.select { |t| t.alive? ? true : (t.join; false) }
while threads.size >= max_threads
puts 'Got Maximum threads'
sleep 1
threads = threads.select { |t| t.alive? ? true : (t.join; false) }
end
rescue Exception => e
puts e
end
end

通过这种方式,我打开一个新线程,通常是传入连接或其他一些东西,将线程添加到线程数组,然后检查我没有比我想要的线程更多的线程。

使用 spawn\channels\fibers 等在 Crystal 中实现类似功能的好方法是什么?

最佳答案

像这样的东西:

require "socket"

ch = Channel(TCPSocket).new

10.times do
spawn do
loop do
socket = ch.receive
socket.puts "Hi!"
socket.close
end
end
end

server = TCPServer.new(1234)
loop do
socket = server.accept
ch.send socket
end

此代码将预生成 10 个光纤来处理请求。 channel 是无缓冲的,因此如果连接没有任何光纤参与,它们就不会排队。

关于multithreading - Crystal 将线程池背后的想法转换为 Fibers/spawn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30853566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com