2013-06-23 6 views
8

मेरे पास एकाधिक क्लाइंट /stream पर सर्वर भेजे गए ईवेंट स्ट्रीम से कनेक्ट करने का प्रयास कर रहे हैं। यह एक क्लाइंट के साथ काम करता है, लेकिन किसी भी क्लाइंट के परिणाम को नए क्लाइंट में जोड़ने के लिए अनिश्चित काल तक डेटा के लिए अवरुद्ध हो रहा है। यदि मैं अधिक डेटा भेजता हूं, तो यह केवल पहले ग्राहक को जाता है, और कोई अन्य नहीं।सर्वर ने फ्लास्क/रेडिस के साथ ईवेंट भेजे: एक से अधिक ग्राहक स्ट्रीम कैसे देख सकते हैं?

import flask 
import time 

app = flask.Flask(__name__) 

def event_stream(): 
    for i in xrange(9999): 
     yield "data: %d\n\n" % i 
     time.sleep(1) 

@app.route("/stream", methods=[ "GET" ]) 
def stream(): 
    return flask.Response(
     event_stream(), 
     mimetype="text/event-stream" 
    ) 

मैं तो gunicorn --worker-class=gevent -w 4 -t 99999 app:app के साथ इस चलाएँ:

यहां एक छोटा टुकड़ा है कि मेरी समस्या को दिखाता है। यह एक ग्राहक के लिए काम करता है, लेकिन GET /stream जारी करते समय कोई अन्य अवरुद्ध हो जाता है।

ब्लॉक का कारण क्या है, और मुझे इसे कैसे ठीक करना चाहिए?

मैंने थोड़ा और डीबग किया और कुछ अजीब परिणाम प्राप्त किए। अगर मैं इस प्रक्रिया को करने, तो ऐसा होता है:

  • प्रारंभ ग्राहक 1 (केवल ग्राहक 1 डेटा प्राप्त)
  • प्रारंभ ग्राहक 2 (केवल ग्राहक 1 डेटा प्राप्त)
  • प्रारंभ ग्राहक 3 (केवल ग्राहक 1 प्राप्त डेटा)
  • प्रारंभ ग्राहक 4 (केवल ग्राहक 1 डेटा प्राप्त)
  • पुनः प्रारंभ ग्राहक 1 (सभी 4 ग्राहकों अचानक एक ही समय में डेटा प्राप्त करना शुरू)
+0

http://stackoverflow.com/questions/13386681/streaming-data-with-python-and-flask – farzad

+0

@ फ़ारज़ैड यह उदाहरण भी इस समस्या से पीड़ित है। –

उत्तर

2

यह पता चला है कि क्रोमियम वेब ब्राउजर के साथ ऐसा कुछ है, जहां मैं परीक्षण कर रहा था। कुछ कारणों से, पहला व्यक्ति पूरा होने तक अनुरोध करने पर वापस आ जाता है। curl का उपयोग करना, या एक गुप्त ब्राउज़र सत्र ने एक ही समय में कई सत्रों को चलाने की अनुमति दी। इसका मतलब है कि मेरी समस्या वास्तव में वास्तविकता में मौजूद नहीं है, यह उसी तरीके से दिखाई देती है जिस तरह से क्रोमियम एक ही संसाधन के साथ-साथ अनुरोधों को संभालता है।

मुझे यकीन नहीं है कि क्रोमियम इस तरह से क्यों व्यवहार करता है, यह अजीब लगता है। किसी भी तरह से, यह एक वास्तविक समस्या नहीं है, केवल मेरे ब्राउज़र द्वारा एक माना जाता है।

+0

मुझे ओएसएक्स पर फ़ायरफ़ॉक्स में समान परिणाम मिलते हैं। यदि मैं एक दूसरे टैब से वही पुन: उपयोग करता हूं, तो यह पहली लटकता है (लगभग 30 के बाद) और फिर शुरू होता है। एक निजी खिड़की शुरू करना दो सत्रों को एक साथ चलाने की अनुमति देता है। – Spaceghost

+0

यह क्रोम 35 और ओपेरा 22 को भी प्रभावित करता है, लेकिन फ़ायरफ़ॉक्स 29 नहीं। विंडोज़ पर सभी। – rhyek

2

मुझे फ़ायरफ़ॉक्स में समान परिणाम मिल रहे थे (जैसा कि मैंने टिप्पणियों में नोट किया था) तो मैंने बंदूक के बजाए मुख्य ब्लॉक में WSGIServer का उपयोग करने के लिए स्विच किया और सबकुछ काम करता है, टाइमआउट समाप्त हो गया है (क्योंकि WSGIServer अपने कर्मचारियों को समय-समय पर नहीं निकालता है लेकिन गनिकोर्न करता है) इसलिए मैंने सोचा कि यह एक जवाब के रूप में जोड़ने लायक है।

इस जोड़ें:

if __name__ == '__main__': 
http_server = WSGIServer(('127.0.0.1', 8001), app) 
http_server.serve_forever() 

तो बस करना

python app.py 

[मैं 30 के दशक के बाद समय समाप्त अगर मैं 'क्रिस कमांड लाइन का इस्तेमाल किया था और 99999 के लिए समाप्ति सेट लेकिन वहाँ नहीं होगा पड़ता था बहुत बाद में रहे हैं]

+0

यह मेरे मामले में समस्या नहीं थी, लेकिन मैं मानता हूं कि यह अन्य मामलों में हो सकता है। धन्यवाद! –

+0

कर्ल के अलावा, क्या आप क्रोमियम के अलावा किसी अन्य चीज़ के साथ यह काम देखते थे? – Spaceghost

+0

नहीं, मैंने नहीं किया। मुझे लगता है कि यह किसी भी ऐसे व्यक्ति के लिए पुन: पेश करना आसान होना चाहिए जो आगे की जांच करना चाहता है :-) –

संबंधित मुद्दे