अजगर 2.7 में, बंद बुला() काम करता है लेकिन केवल तभी जब आप, serve_forever के माध्यम से सेवा कर रहे हैं, क्योंकि यह async चयन करें और एक मतदान पाश उपयोग करता है। Handle_request() के साथ अपना खुद का लूप चलाना विडंबनात्मक रूप से इस कार्यक्षमता को छोड़ देता है क्योंकि यह एक गूंगा अवरोधक कॉल का तात्पर्य है।
SocketServer.py के BaseServer से:
def serve_forever(self, poll_interval=0.5):
"""Handle one request at a time until shutdown.
Polls for shutdown every poll_interval seconds. Ignores
self.timeout. If you need to do periodic tasks, do them in
another thread.
"""
self.__is_shut_down.clear()
try:
while not self.__shutdown_request:
# XXX: Consider using another file descriptor or
# connecting to the socket to wake this up instead of
# polling. Polling reduces our responsiveness to a
# shutdown request and wastes cpu at all other times.
r, w, e = select.select([self], [], [], poll_interval)
if self in r:
self._handle_request_noblock()
finally:
self.__shutdown_request = False
self.__is_shut_down.set()
यहाँ एक और धागे से एक अवरुद्ध बंद कर रही है, एक घटना का उपयोग कर पूरा करने के लिए प्रतीक्षा करने के लिए के लिए मेरे कोड का हिस्सा:
class MockWebServerFixture(object):
def start_webserver(self):
"""
start the web server on a new thread
"""
self._webserver_died = threading.Event()
self._webserver_thread = threading.Thread(
target=self._run_webserver_thread)
self._webserver_thread.start()
def _run_webserver_thread(self):
self.webserver.serve_forever()
self._webserver_died.set()
def _kill_webserver(self):
if not self._webserver_thread:
return
self.webserver.shutdown()
# wait for thread to die for a bit, then give up raising an exception.
if not self._webserver_died.wait(5):
raise ValueError("couldn't kill webserver")
मुझे लगता है कि आप "self.erve_forever()" को "self.stopped = True" के बाद कॉल कर सकते हैं और "create_dummy_request (self)" को लागू करने से बच सकते हैं। यह अब तक मेरे लिए काम करता है, लेकिन वहां एक सूक्ष्मता हो सकती है जिसे मैं याद कर रहा हूं। –
जहां तक मैं पाइथन 2.7 में 'बेससेवर.serve_forever() 'स्रोतों को देख रहा हूं, मुझे लगता है कि यह पहले से ही एक ध्वज लागू किया गया है,' __shutdown_request', प्लस' __is_shut_down' 'threading.Event' शीर्ष पर। तो मैं यहां देखे गए वास्तविक उत्तर 'allow_reuse_address = True' लाइन है। –