2009-07-02 17 views
7

üzerinde Twisted kapatma işlemini engeller. CherryPy web sunucusu da dahil olmak üzere başka bir iş parçacığı başlattıktan sonra ana iş parçamda reaktöre reactor.run() ile başlatarak Twisted çalıştıran bir uygulama var.CherryPy, Windows

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() 

Burada kapatma temiz bir şekilde yapar ben CherryPy'ın olmadan yazdım farklı bir program olduğu için CherryPy suçlu, burada olduğuna inanıyoruz: İşte Ctrl + C Windows üzerinde Linux üzerinde değil basıldığında düzgün kapanınca bir program Linux hem de Windows üzerinde Ctrl + C basıldığında:

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() 

kimse sorunun ne olduğunu bir fikri var mı? CherryPy i? reactor.callFromThread kullanarak arama hiçbir işlevi çalışırken CherryPy

  • çalışmadığı zamanlarda ben reactor.callFromThread kullanarak sinyal eylemcilerden işlevleri çağırabilir, Linux olduğum herşeyi

    • Windows'ta
    • çalışır: İşte benim bilmece Bir sinyal işleyici, hiç çalışacaktır (sinyal işleyicisinin kendisini çağırdığını doğruladım)

    Bu konuda ne yapabilirim? CherryPy'i çalıştırırken bir sinyal işleyicisinden Windows'ta Twisted'i nasıl kapatabilirim? Bu bir hata mı, yoksa bu iki projenin bir kısmının belgelerinin önemli bir kısmını kaçırdım mı? Hızlı başlatmayı çağırdığınızda CherryPy varsayılan olarak sinyalleri işliyor.

  • cevap

    14

    Sizin durumunuzda, sadece birkaç satır olan hızlı başlatma işlemini açmanız ve seçip seçmeniz gerekir. Senin durumunda

    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() 
    

    , sen sinyal işleyici gerekmez, böylece o atlayabilirsiniz: Burada hızlı başlangıç ​​bagajında ​​yaptığı temelde bu. Ayrıca, ana iş parçacığından CherryPy'yi başlatmıyorsanız, engine.block'u çağırmanız gerekmez. Engine.block(), ana iş parçacığının hemen sonlandırılmaması için bir yoldur, ancak bunun yerine işlem sonlandırması için bekleyin (bu nedenle otoreload güvenilir bir şekilde çalışır; bazı platformlar, herhangi bir iş parçacığından ancak ana iş parçacığından execv çağrılmasına neden olur).

    Blok() çağrısını kaldırırsanız, hızlı başlatmanın etrafında Thread() öğesine bile ihtiyacınız yoktur. Yani, çizgi değiştirin:

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

    ile:

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

    teşekkürler çok! Cevabınız o kadar iyi yazılmış ve yardımcı olmuştu ki, size sadece 50 itibarı vermek için bir ödül verdim. –