की अपेक्षा नहीं करता हूं, मैं 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()
का उपयोग कर सर्वर चलाएं ताकि यह वास्तव में पहले कनेक्शन को पकड़ने के लिए जीवित रहे?
:
start()
औरserve_forever()
के बीच क्या अंतर है?- दूसरे संदर्भ में मुझे किस संदर्भ में चुनना चाहिए?
- पहली विधि का उपयोग करते समय
gevent.spawn()
औरgevent.joinall()
पर कॉल करने के लिए आवश्यक हैं, लेकिन किसी भी तरह से यह स्पष्ट है कि उन्हें स्ट्रीमसेवर-दस्तावेज़ से बाहर रखा गया है?
धन्यवाद, यह यह मंजूरी दे दी:
यहाँ एक उदाहरण है। Gevent लिखने के लिए धन्यवाद :) – msvalkon
fyi यह लिंक मृत लगता है – scape
@scape धन्यवाद, अपडेट किया गया। –