मैं एपीआई द्वारा requests
मॉड्यूल का उपयोग करके प्रदान की गई एक ईवेंट स्ट्रीम का उपभोग करने का प्रयास कर रहा हूं। मैंने बफरिंग समस्या की तरह दिखने में भाग लिया है: requests
मॉड्यूल एक ईवेंट द्वारा अंतराल लगता है।पाइथन "अनुरोध" लाइब्रेरी के साथ http प्रतिक्रिया स्ट्रीमिंग पढ़ना
मैं कोड है कि कुछ इस तरह दिखता है:
r = requests.get('http://localhost:8080/api/v1beta1/watch/services',
stream=True)
for line in r.iter_lines():
print 'LINE:', line
Kubernetes ईवेंट नोटिफिकेशन का उत्सर्जन करता है के रूप में, इस कोड को केवल प्रदर्शित करेगा पिछले घटना उत्सर्जित जब एक नई घटना में आता है, जो यह लगभग पूरी तरह से बेकार बना देता है कोड के लिए जो सेवा पर प्रतिक्रिया देने की आवश्यकता है, ईवेंट जोड़ें/हटाएं।
मैं एक उपप्रक्रिया में curl
को उत्पन्न करने के बजाय requests
पुस्तकालय का उपयोग करके इस समाधान कर लिया है:
p = subprocess.Popen(['curl', '-sfN',
'http://localhost:8080/api/watch/services'],
stdout=subprocess.PIPE,
bufsize=1)
for line in iter(p.stdout.readline, b''):
print 'LINE:', line
यह काम करता है, लेकिन कुछ लचीलापन की कीमत पर। क्या पर कोई तरीका है requests
लाइब्रेरी के साथ इस बफरिंग समस्या से बचें?
यह तर्क दिया जा सकता है कि कौन सा कार्यान्वयन सही है - यदि कोई डेटा उपलब्ध हो तो आपका कोई नकली "लॉजिकल लाइन ब्रेक" डालेगा। सही दृष्टिकोण डेटा के कुल आकार को जानने के लिए प्रतीत होता है (एक निर्दिष्ट करना टीसीपी संचार के लिए एक आवश्यकता है) और ज्ञात अंत में केवल आंशिक पढ़ने को नियोजित करता है। –
मुझे नहीं लगता कि आप तर्क दे सकते हैं कि मौजूदा कार्यान्वयन सही है। मेरा कठोर परीक्षण नहीं हुआ है, लेकिन यह निश्चित रूप से बेहतर काम करता है। एक और सही कार्यान्वयन - आदर्श रूप से अपस्ट्रीम पैच के रूप में सबमिट किया गया - बहुत उपयोगी होगा। – larsks
@ivan_pozdeev * "सही दृष्टिकोण डेटा के कुल आकार को जानने के लिए प्रतीत होता है (एक निर्दिष्ट करना टीसीपी संचार के लिए एक आवश्यकता है)" * - नहीं, टीसीपी एक * स्ट्रीम * है और इसमें अनंत लंबाई हो सकती है। मुझे यकीन नहीं है कि आपने यह कहां सुना है लेकिन यह मूल रूप से असत्य है। –