Как я устанавливаю тайм-аут сокета в Ruby?

Попробуйте:

def func(x):
    x['col2'] = np.arange(0, len(x['col1'])*100, 100)
    return x
df.apply(lambda x: func(x) , axis=1)
19
задан Readonly 23 October 2008 в 21:44
поделиться

3 ответа

Решение, которое я нашел, который, кажется, работает, состоит в том, чтобы использовать Тайм-аут:: тайм-аут :

require 'timeout'
    ...
begin 
    timeout(5) do
        message, client_address = some_socket.recvfrom(1024)
    end
rescue Timeout::Error
    puts "Timed out!"
end
17
ответ дан 30 November 2019 в 03:21
поделиться

Объект тайм-аута является хорошим решением.

Это - пример асинхронного ввода-вывода (не блокирующийся по своей природе, и происходит асинхронно с потоком приложения.)

IO.select(read_array
[, write_array
[, error_array
[, timeout]]] ) => array or nil

Может использоваться для получения того же эффекта.

require 'socket'

strmSock1 = TCPSocket::new( "www.dn.se", 80 )
strmSock2 = TCPSocket::new( "www.svd.se", 80 )
# Block until one or more events are received
#result = select( [strmSock1, strmSock2, STDIN], nil, nil )
timeout=5

timeout=100
result = select( [strmSock1, strmSock2], nil, nil,timeout )
puts result.inspect
if result

  for inp in result[0]
    if inp == strmSock1 then
      # data avail on strmSock1
      puts "data avail on strmSock1"
    elsif inp == strmSock2 then
      # data avail on strmSock2
      puts "data avail on strmSock2"
    elsif inp == STDIN
      # data avail on STDIN
      puts "data avail on STDIN"
    end
  end
end
15
ответ дан 30 November 2019 в 03:21
поделиться

Я думаю, что неблокирующий подход - лучший вариант.
Я пробовал использовать упомянутую выше статью, но все равно не смог заставить ее зависнуть.
эта статья неблокирующая сеть и описанный выше подход jonke привели меня на правильный путь. Мой сервер блокировался при первоначальном подключении, поэтому мне нужно было, чтобы он был немного ниже.
rdoc сокета может передать более подробную информацию в connect_nonblock

def self.open(host, port, timeout=10)
 addr = Socket.getaddrinfo(host, nil)
 sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)

 begin
  sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
 rescue Errno::EINPROGRESS
  resp = IO.select([sock],nil, nil, timeout.to_i)
  if resp.nil?
    raise Errno::ECONNREFUSED
  end
  begin
    sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
  rescue Errno::EISCONN
  end
 end
 sock
end

, чтобы получить хороший тест. запустите простой сервер сокетов, а затем нажмите ctrl-z для его фонового

, IO.select ожидает, что данные поступят во входной поток в течение 10 секунд. это может не сработать, если это не так.

Это должна быть хорошая замена открытому методу TCPSocket.

8
ответ дан 30 November 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: