Bir Ruby soketindeki işlemleri engellemek için zaman aşımını nasıl ayarlarsınız?Yuva zaman aşımını Ruby'de nasıl ayarlayabilirim?
cevap
çalışması için görünür buldum çözümü Timeout::timeout kullanmaktır:
require 'timeout'
...
begin
timeout(5) do
message, client_address = some_socket.recvfrom(1024)
end
rescue Timeout::Error
puts "Timed out!"
end
Zaman aşımı kullanmak bir hatadır. Yeşil çadırlar nedeniyle, IO üzerinde bloke olan her şey zaman aşımı ipini de engelleyecek ve böylece çalışmayı durduracaktır. – Sardathrion
@Sardathrion, geri bildirim için teşekkürler, ancak bir çözüm, olumsuz bir yorumdan daha iyi olurdu :) – Mike
Ruby thread'ler bozuk Korkarım. Daha iyi bir dil bulun - sert ama doğru. – Sardathrion
zaman aşımı nesne iyi bir çözümdür.
Bu uyumsuz I/O örneğidir (doğada engellenmeyen ve zaman uyumsuz uygulama akışının meydana gelir.)
IO.select(read_array
[, write_array
[, error_array
[, timeout]]]) => array or nil
aynı etkiyi elde etmek için kullanılabilir.
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
Engellemeyi engelleyen yaklaşımın yol olduğunu düşünüyorum.
Yukarıdaki makaleyi denedim ve hala askıya alabilirim.
Bu makale non blocking networking ve yukarıda jonke'nin yaklaşımı beni doğru yolda buldu. Sunucum ilk bağlantıda engellendi, bu yüzden biraz daha düşük bir seviyeye ihtiyacım vardı.
soket rdoc iyi testi yaptırmak 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
içine daha ayrıntılı bilgi verebilir. basit bir soket sunucusunu başlatın ve daha sonra arka plan için bir ctrl-z yapın.
IO.select, 10 saniye içinde giriş akışında veri gelmesini bekler. Bu durum böyle değilse çalışmayabilir.
TCPSocket'in açık yöntemi için iyi bir yedek olmalıdır.
Bu benim için çok iyi çalışıyor. MRG'nin yeşil dişleri nedeniyle zaman aşımı hiçbir koşulda kullanılmamalıdır. – Sardathrion
Bloke olmayan bir bağlantı hazır olduğunda yazılabilir. 'IO.select'i kullanın (nil, [çorap], nil, timeout.to_i)' – tmm1
Sadece tmm1'in yorumunu kullandıktan sonra benim için çalıştım. –
- 1. Java, yuva zaman aşımını arttırın
- 2. İş zaman aşımını Jenkins DSL kullanarak nasıl ayarlayabilirim
- 3. Linq2Entities'de zaman aşımını nasıl artırabilirsiniz?
- 4. PHP'de .htaccess aracılığıyla oturum zaman aşımını genişletme
- 5. talep zaman aşımını belirtin $ http
- 6. Java ROMA çözümleyici varsayılan yuva zaman aşımı nasıl değiştirilir?
- 7. TCP bağlantı zaman aşımını sınama nasıl ayarlanır?
- 8. İleticiyi $ zaman aşımını beklemeden nasıl yapabilirim?
- 9. reCAPTCHA oturum zaman aşımını artırın
- 10. Yuva okuma ve zaman damgaları
- 11. Oturum zaman aşımını 30 dakikadan daha büyük bir sürede nasıl ayarlayabilirim
- 12. Kullanıcı başına oturum zaman aşımını özelleştirme - ASP.NET
- 13. routeChange üzerinde AngularJS $ zaman aşımını iptal etme
- 14. PHP file_get_contents zaman aşımını dikkate almıyor mu?
- 15. Kullanıcı iptali arasındaki zaman aşımını ayırt etme
- 16. Ayrıştırma sorguları için bağlantı zaman aşımını ayarlama
- 17. Hystrix Devre Kesici Zaman Aşımını Artırın mı?
- 18. SSLSocketFactory ayar el sıkışması zaman aşımı ve yuva özellikleri
- 19. nasıl C# kod satırı için zaman aşımını ayarlamak için
- 20. Ana iş parçacığındaki java kodundaki bazı zaman aşımını nasıl ayarlayabilirim? Ben Yakut bu özdeş java işlevsellik arıyorum
- 21. Spring Boot Java Config Oturum Zaman Aşımını Ayarla
- 22. CodeIgniter 3'te veritabanı bağlantısı zaman aşımını ayarlayın
- 23. Monitör zaman aşımını powershell kullanarak "asla" olarak ayarlama
- 24. Ruby'de RestClient gem'de zaman aşımı nasıl ayarlanır?
- 25. Ubuntu'ya oturum açarken oturum açma zaman aşımını değiştir
- 26. Uzun DB istekleri için Node.js zaman aşımını önleyin
- 27. Mocha, sadece asenkron testlerimle beklemeyi ve zaman aşımını nasıl biliyor? Ben Mocha ile test ediyorum zaman
- 28. Güvenli POP3 sunucuları ile imap_timeout işlevleri için php.ini zaman aşımını nasıl geçersiz kılar?
- 29. Bir yay web uygulamasının varsayılan oturum zaman aşımını değiştirme
- 30. Paramiko ile SFTP/SSH oturum zaman aşımını önleyin
Kabul edileninizden çok daha iyi bir çözüm buldu: http://stackoverflow.com/a/12111120/216314 –
http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/Timeout.html –
[Özel kilitler ile zaman aşımı modülü] (http://stackoverflow.com/a/15304835/1301972). –