Question

Ceci est un peu une question délicate;

Je travaille avec mod_wsgi en python et que vous voulez faire un tampon de sortie qui donne HTML sur une base continue (jusqu'à ce que la page se fait le chargement).

Fonction En ce moment j'ai mon script mis en place afin que l'application () crée un thread séparé page »pour le code de la page, puis immédiatement après, il court une boucle continue pour la mémoire tampon de sortie en utilisant la file d'attente de lib python.

Y at-il une meilleure façon d'avoir cette mise en place? Je pensé à faire le tampon de sortie soit le fil (au lieu de la page), mais le problème, est la fonction Application () est la seule fonction qui peut être pour donner le HTML à Apache, qui (pour autant que je peux dire, rend cette idée impossible).

L'inconvénient que je vois avec ma configuration actuelle, est en cas d'erreur, sans que le fil de la page continue sur un peu, je ne peux pas facilement interrompre le tampon et la sortie.

(Il suce un peu que mod_wsgi n'a pas une accumulation dans un tampon de sortie pour gérer cela, je déteste charger la page entière, puis envoyer la sortie une seule fois, il en résulte une charge page beaucoup plus lente).

Était-ce utile?

La solution

  

(Il suce un peu que mod_wsgi n'a pas une accumulation dans un tampon de sortie pour gérer cela, je déteste charger la page entière, puis envoyer la sortie une seule fois, il en résulte une charge page beaucoup plus lente).

À moins que vous faites une sorte de streaming ou l'application asynchrone, vous voulez envoyer la page entière à la fois 99,9% du temps. La seule exception que je peux penser est que si vous envoyez un grand page web (et grand, je veux dire dans les centaines de méga-octets).

La raison pour laquelle je mentionne cela est à souligner que si vous avez des problèmes de performance, il est probablement pas parce que vous êtes sortie en mémoire tampon. La façon de gérer le plus simple est de faire quelque chose comme ceci:

def Application(environ, start_response):
    start_response('200 Ok', [('Content-type','text/plain')])
    response = []
    response.append('<h1>')
    response.append('hello, world!')
    response.append('</h1>')
    return [''.join(response)] #returns ['<h1>hello, world!</h1>']

Votre meilleur pari est d'utiliser une structure de données mutable comme une liste pour tenir les morceaux du message, puis de les réunir dans une chaîne comme je l'ai fait ci-dessus. Sauf si vous avez une sorte de besoin particulier, ce qui est probablement la meilleure approche générale.

Autres conseils

mod_wsgi aurait un support intégré pour générateurs. Donc, si vous utilisez un cadre comme CherryPy il vous suffit de le faire:

def index():
    yield "Some output"
    #Do Somemore work
    yield "Some more output"

Si chaque rendement retourne à l'utilisateur un morceau de la page.

Voici quelques notions de base de CherrPy là-bas et la mise en œuvre comment cela fonctionne http: //www.cherrypy. org / wiki / ReturnVsYield

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top