2011-05-16 6 views
7

LuaSocket HTTP मॉड्यूल प्रलेखन कहते हैं एक टाइमआउट एक HTTP कनेक्शन पर सेट किया जा सकता है कि:lua http सॉकेट टाइमआउट

पोर्ट:

निम्नलिखित स्थिरांक HTTP मॉड्यूल के डिफ़ॉल्ट व्यवहार को नियंत्रित करने के लिए सेट किया जा सकता : कनेक्शन के लिए इस्तेमाल किया गया डिफ़ॉल्ट बंदरगाह; प्रोक्सी: कनेक्शन के लिए उपयोग की जाने वाली डिफ़ॉल्ट प्रॉक्सी; टाइमआउट: सभी I/O संचालन के लिए टाइमआउट सेट करता है; उपयोगकर्ता: डिफ़ॉल्ट उपयोगकर्ता एजेंट सर्वर को सूचित किया गया। http://w3.impa.br/~diego/software/luasocket/http.htm

मैं इन स्थिरांक को लुआ लिपि में कैसे सेट करूं?

+1

अपना समाधान एक उत्तर के रूप में जोड़ें और इसे स्वीकार करें, इसलिए यह प्रश्न पूरा हो जाएगा। –

+0

मैंने कोशिश की लेकिन मुझे अपने स्वयं के प्रश्न का उत्तर देने से पहले मुझे पहले पोस्ट के 8 घंटे बाद इंतजार करना होगा। मैं इसे शाम (सीईटी) करूँगा। – ripat

+0

यह प्रतिबंध अब जाना चाहिए कि आपके पास 10 से अधिक प्रतिनिधि अंक हैं। – BMitch

उत्तर

6

आप ऐसा कर सकते हैं पूरे HTTP मॉड्यूल के बजाय एक अनुरोध के लिए एक समय समाप्ति सेट करने के लिए:

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    req_sock:settimeout(5) 
    return req_sock 
end} 

ध्यान दें कि :settimeout के डिफ़ॉल्ट व्यवहार, साथ ही http.TIMEOUT की तरह वैश्विक सेटिंग्स, एक सेट अनुरोध अनुरोध के भीतर किसी भी व्यक्तिगत ऑपरेशन के लिए समय सीमा - दूसरे शब्दों में, ऑपरेशन बिना किसी गतिविधि के बिना किसी गतिविधि के जा सकता है। यदि आप एक ऑपरेशन पर समग्र ऊपरी बाउंड सेट करना चाहते हैं - एक समय जब कुल अनुरोध पार नहीं हो सकता है, गतिविधि पर ध्यान दिए बिना - आपको के :settimeout पर दूसरे पैरामीटर के रूप में एक मोड तर्क पास करना चाहिए, जैसे:

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    -- note the second parameter here 
    req_sock:settimeout(5, 't') 
    return req_sock 
end} 

एक उदाहरण दो मोड के बीच अंतर को वर्णन करने के रूप में, कल्पना करो कि, आपके अनुरोध करने के बाद, सर्वर प्रतिक्रिया का एक हिस्सा एक बार एक दूसरे के साथ जवाब दिया, सात सेकंड लेने के समग्र पूरा करने के लिए। पांच-सेकंड की स्थापना, तथापि req_sock:settimeout(5, 't') साथ: req_sock:settimeout(5, 'b') (या बस req_sock:settimeout(5)) एक 5 सेकंड ब्लॉक समाप्ति सेट करने के साथ, इस अनुरोध को ठीक आगे बढ़ना होगा अंतर्निहित आई/ओ संचालन पाँच सेकंड से अधिक समय लगा से कोई भी रूप में, कुल टाइमआउट, अनुरोध पांच सेकंड के बाद विफल हो जाएगा।

बेशक

, यह इन दोनों अवधियों वाले के लिए प्रतिबंध सेट बनाना उचित है, दोनों एक छोटी निष्क्रियता टाइमआउट के साथ-साथ एक लंबे समय तक समग्र टाइमआउट हो रही है। के रूप में इस तरह के, per the documentation, आप दो अलग-अलग कॉल दोनों निर्दिष्ट करने के लिए कर सकते हैं:

local socket = require "socket" 
local http = require "socket.http" 
response = http.request{url=URL, create=function() 
    local req_sock = socket.tcp() 
    req_sock:settimeout(5, 'b') 
    req_sock:settimeout(30, 't') 
    return req_sock 
end} 
+0

मुझे यकीन नहीं है कि मैं इसे समझता हूं। समाधान के साथ मैंने पाया (अब नीचे पोस्ट किया गया है), क्या मैं वास्तव में सभी नए HTTP सॉकेट के लिए टाइमआउट बदलता हूं? यदि ऐसा है, तो कनेक्शन समाप्त होने के बाद मैं इसके मान को डिफ़ॉल्ट 60 सेकंड में रीसेट कर सकता हूं। क्या आप अपने स्निपेट पर विशेष रूप से 'create = function()' भाग पर व्याख्या कर सकते हैं? – ripat

+0

मैंने अभी कुछ परीक्षण किया है और, वास्तव में, जब मैं 'mysocket.TIMEOUT' के साथ टाइमआउट बदलता हूं तो यह तब तक बनाए गए सभी नए HTTP सॉकेट के लिए वह मान रखता है जब तक कि आप इसे दोबारा नहीं बदल देते। आपके सुझाव के साथ आप दो सॉकेट नहीं बनाते हैं? एक http और एक टीसीपी? – ripat

+1

@ripat अनुरोध का 'create' पैरामीटर * * * * टीसीपी सॉकेट बनाने के लिए फ़ंक्शन निर्दिष्ट करता है जो इसे * HTTP * अनुरोध करने के लिए उपयोग करता है ([टीसीपी ट्रांसपोर्ट परत पर जा रही HTTP अनुप्रयोग परत] (http: // en। wikipedia.org/wiki/TCP/IP_model))। यदि आप कोई निर्माण फ़ंक्शन निर्दिष्ट नहीं करते हैं, तो http.request डिफ़ॉल्ट रूप से 'tcp() 'पर एक सादा कॉल का उपयोग करेगा (देखें [मैन्युअल] (http://w3.impa.br/~diego/software/luasocket/ http.html))। –

12

यह तुलना में आसान मैंने सोचा था। बस

local mysocket = require("socket.http") 
mysocket.TIMEOUT = 5 
+2

यह सही उत्तर – javsmo

+2

है क्या इसका 'साइड इफेक्ट्स' है, जो फ़ाइल के बाहर http सॉकेट कॉन्फ़िगरेशन बदल रहा है जो आवश्यकता करता है? (यानी एक ही प्रोग्राम पर कोड, लेकिन दूसरी फाइल पर जो http.socket के लिए अपनी आवश्यकता है) – josinalvo

+1

@josinalvo: हां, किसी प्रोग्राम के भीतर सभी फाइलें 'package.loaded' के तहत उनके सामान्य मॉड्यूल के समान उदाहरण साझा करती हैं। साइड इफेक्ट्स के बिना ऐसा करने के लिए [मेरा जवाब] (http://stackoverflow.com/a/6021774/34799) देखें। –