2009-07-02 12 views
7

पर ट्विस्टेड शट डाउन के साथ हस्तक्षेप करता है मेरे पास एक ऐसा एप्लिकेशन है जो चेरीपी वेब सर्वर समेत कुछ अन्य धागे शुरू करने के बाद मेरे मुख्य थ्रेड में reactor.run() के साथ रिएक्टर शुरू करके ट्विस्ट चलाता है।चेरीपी विंडोज

from threading import Thread 
from signal import signal, SIGINT 

import cherrypy 

from twisted.internet import reactor 
from twisted.web.client import getPage 

def stop(signum, frame): 
    cherrypy.engine.exit() 
    reactor.callFromThread(reactor.stop) 
signal(SIGINT, stop) 

class Root: 
    @cherrypy.expose 
    def index(self): 
     reactor.callFromThread(kickoff) 
     return "Hello World!" 

cherrypy.server.socket_host = "0.0.0.0" 
Thread(target=cherrypy.quickstart, args=[Root()]).start() 

def print_page(html): 
    print(html) 

def kickoff(): 
    getPage("http://acpstats/account/login").addCallback(print_page) 

reactor.run() 

मुझे विश्वास है कि CherryPy अपराधी यहाँ है, क्योंकि यहां एक अलग कार्यक्रम है कि मैं CherryPy बिना लिखा है कि बंद सफाई से करता है: यहाँ एक प्रोग्राम है जो बंद हो जाता है सफाई से जब Ctrl + C लिनक्स पर नहीं बल्कि दबाया जाता है विंडोज पर है लिनक्स और सी दोनों पर जब Ctrl + C दबाया जाता है:

from time import sleep 
from threading import Thread 
from signal import signal, SIGINT 

from twisted.internet import reactor 
from twisted.web.client import getPage 

keep_going = True 
def stop(signum, frame): 
    global keep_going 
    keep_going = False 
    reactor.callFromThread(reactor.stop) 
signal(SIGINT, stop) 

def print_page(html): 
    print(html) 

def kickoff(): 
    getPage("http://acpstats/account/login").addCallback(print_page) 

def periodic_downloader(): 
    while keep_going: 
     reactor.callFromThread(kickoff) 
     sleep(5) 

Thread(target=periodic_downloader).start() 
reactor.run() 

क्या किसी को पता है कि समस्या क्या है? यहाँ मेरी पहेली है:

  • लिनक्स सब कुछ पर काम करता है
  • Windows पर, मैं reactor.callFromThread का उपयोग कर संकेत संचालकों से कार्यों कॉल कर सकते हैं जब CherryPy
  • जब CherryPy चल रहा है, कोई समारोह है कि मैं से reactor.callFromThread का उपयोग कर कॉल नहीं चल रहा है एक सिग्नल हैंडलर कभी निष्पादित करेगा (मैंने सत्यापित किया है कि सिग्नल हैंडलर स्वयं को कॉल किया जाता है)

मैं इसके बारे में क्या कर सकता हूं? चेरीपी चलाने के दौरान मैं सिग्नल हैंडलर से विंडोज़ पर ट्विस्ट कैसे बंद कर सकता हूं? क्या यह एक बग है, या क्या मैंने इन दो परियोजनाओं में से किसी एक के लिए दस्तावेज़ीकरण के कुछ महत्वपूर्ण हिस्से को याद किया है?

उत्तर

14

जब आप क्विकस्टार्ट को कॉल करते हैं तो चेरीपी डिफ़ॉल्ट रूप से संकेतों को संभालती है। आपके मामले में, आपको शायद क्विकस्टार्ट को अनलॉक करना चाहिए, जो केवल कुछ पंक्तियां हैं, और चुनें और चुनें। यहाँ मूल रूप से क्या त्वरित प्रारंभ ट्रंक में करता है:

if config: 
    cherrypy.config.update(config) 

tree.mount(root, script_name, config) 

if hasattr(engine, "signal_handler"): 
    engine.signal_handler.subscribe() 
if hasattr(engine, "console_control_handler"): 
    engine.console_control_handler.subscribe() 

engine.start() 
engine.block() 

आपके मामले में, आप संकेत संचालकों की जरूरत नहीं है, ताकि आप उन को छोड़ सकते हैं। यदि आप मुख्य धागे से चेरीपी शुरू नहीं कर रहे हैं तो आपको इंजन को कॉल करने की भी आवश्यकता नहीं है। Engine.block() मुख्य थ्रेड को तुरंत समाप्त नहीं करने का एक तरीका है, लेकिन इसके बजाय प्रक्रिया समाप्ति के लिए चारों ओर प्रतीक्षा करें (यह इतनी ऑटोरेलोड लोड विश्वसनीय रूप से काम करता है; कुछ प्लेटफ़ॉर्म में किसी भी थ्रेड से मुख्यवृत्त को कॉल करने में समस्याएं होती हैं लेकिन मुख्य धागा)।

यदि आप ब्लॉक() कॉल को हटाते हैं, तो आपको क्विकस्टार्ट के आसपास थ्रेड() की भी आवश्यकता नहीं है।

cherrypy.tree.mount(Root()) 
cherrypy.engine.start() 
+3

धन्यवाद इतना: तो, अपनी लाइन बदल देते हैं:

Thread(target=cherrypy.quickstart, args=[Root()]).start() 

के साथ! आपका जवाब इतना अच्छी तरह से लिखित और सहायक था कि मैंने आपको 50 प्रतिष्ठा देने के लिए एक उपहार दिया। –

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

  • कोई संबंधित समस्या नहीं^_^