2012-04-23 15 views
5

की अपेक्षा नहीं करता हूं, मैं gevent नियोजित अवधारणाओं के आस-पास अपने मस्तिष्क को लपेटने की कोशिश कर रहा हूं। यहां गीवेंट कोड भंडार से एक उदाहरण दिया गया है। यह एक साधारण गूंज सर्वर है।gevent StreamServer.start() ऐसा लगता है कि मैं

from gevent.server import StreamServer 

# this handler will be run for each incoming connection in a dedicated greenlet 
def echo(socket, address): 
    print ('New connection from %s:%s' % address) 
    socket.sendall('Welcome to the echo server! Type quit to exit.\r\n') 
    # using a makefile because we want to use readline() 
    fileobj = socket.makefile() 
    while True: 
     line = fileobj.readline() 
     if not line: 
      print ("client disconnected") 
      break 
     if line.strip().lower() == 'quit': 
      print ("client quit") 
      break 
     fileobj.write(line) 
     fileobj.flush() 
     print ("echoed %r" % line) 


if __name__ == '__main__': 
    # to make the server use SSL, pass certfile and keyfile arguments to the constructor 
    server = StreamServer(('0.0.0.0', 6000), echo) 
    # to start the server asynchronously, use its start() method; 
    # we use blocking serve_forever() here because we have no other jobs 
    print ('Starting echo server on port 6000') 
    server.serve_forever() 

यह काफी सरल लगता है और मैं यह काम करता हूं। हालांकि यह टिप्पणी में कहा गया है कि serve_forever() एक अवरुद्ध कार्य है। यदि मैं अंतिम पंक्ति को server.start() पर बदलता हूं तो प्रोग्राम प्रत्येक पंक्ति को एक बार निष्पादित करने के बाद बंद हो जाएगा। मैं कुछ गलत कर रहा हूं लेकिन दस्तावेज़ीकरण बहुत उपयोगी नहीं है।

प्रलेखन अनुभाग implementing servers with gevent में, यह कहना है कि start() का उपयोग करते समय निम्न कोड का उपयोग कर प्रत्येक नए कनेक्शन के लिए एक नया greenlet अंडे चाहिए:

def handle(socket, address): 
    print 'new connection!' 

server = StreamServer(('127.0.0.1', 1234), handle) # creates a new server 
server.start() # start accepting new connections 

और फिर सही होने के बाद यह कहना है कि The server_forever() method calls start() and then waits until interrupted or until the server is stopped. मैं कैसे करना चाहिए start() का उपयोग कर सर्वर चलाएं ताकि यह वास्तव में पहले कनेक्शन को पकड़ने के लिए जीवित रहे?

इसके अलावा

:

  1. start() और serve_forever() के बीच क्या अंतर है?
  2. दूसरे संदर्भ में मुझे किस संदर्भ में चुनना चाहिए?
  3. पहली विधि का उपयोग करते समय gevent.spawn() और gevent.joinall() पर कॉल करने के लिए आवश्यक हैं, लेकिन किसी भी तरह से यह स्पष्ट है कि उन्हें स्ट्रीमसेवर-दस्तावेज़ से बाहर रखा गया है?

उत्तर

9
  1. start() एक अतुल्यकालिक समारोह एक सुन मोड में एक सर्वर डालता है है। यह आपके कार्यक्रम को बाहर निकलने से नहीं रोकता है, जो आपकी ज़िम्मेदारी है।
  2. साधारण मामलों में आप serv_forever() का उपयोग कर सकते हैं। प्रारंभ() उपयोगी हो जाता है जब आपको सर्वर शुरू करने के अलावा एकाधिक सर्वर शुरू करने या कुछ और करने की आवश्यकता होती है।
  3. नहीं, gevent.spawn() और gevent.joinall() के पास सर्वर से कुछ लेना देना नहीं है।

gevent 1.0 के साथ यह वास्तव में gevent.wait() का उपयोग करने के लिए सबसे अच्छा है जो तब तक ब्लॉक करता है जब तक कोई सक्रिय कनेक्शन/ग्रीनलेट/श्रोताओं/निरीक्षक नहीं होते। https://github.com/gevent/gevent/blob/master/examples/portforwarder.py

+0

धन्यवाद, यह यह मंजूरी दे दी:

यहाँ एक उदाहरण है। Gevent लिखने के लिए धन्यवाद :) – msvalkon

+0

fyi यह लिंक मृत लगता है – scape

+0

@scape धन्यवाद, अपडेट किया गया। –

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