2010-07-02 14 views
6

Je sais que cherrypy est multithread et possède également une implémentation de pool de threads.
Je voulais donc essayer un exemple montrant un comportement multithread.
Maintenant, supposons que j'ai ma une fonction dans la classe racine et de repos toutes choses sont configurées
Exemple de multithreading Cherrypy

def testPage(self, *args, **kwargs): 
    current = threading.currentThread() 
    print 'Starting ' , current 
    time.sleep(5) 
    print 'Ending ' ,current 
    return '<html>Hello World</html>' 

Maintenant, supposons que je lance ma page http://localhost:6060/root/testPage dans 3-4 onglets du navigateur.
Quel est le résultat que je reçois est

Starting <WorkerThread(CP WSGIServer Thread-10, started 4844)> 
Ending <WorkerThread(CP WSGIServer Thread-10, started 4844)> 
Starting <WorkerThread(CP WSGIServer Thread-7, started 4841)> 
Ending <WorkerThread(CP WSGIServer Thread-7, started 4841)> 
Starting <WorkerThread(CP WSGIServer Thread-10, started 4844)> 
Ending <WorkerThread(CP WSGIServer Thread-10, started 4844)> 

La chose que je peux comprendre clairement que cela crée de nouveaux threads pour le traitement de chaque nouvelle demande, mais je ne peux pas comprendre pourquoi chaque fois que je
... ending..starting départ ..ending
et pourquoi ne pas commencer ... starting..ending..ending parfois
Parce que mon hypothèse est que time.sleep fera un fil de suspendre et d'autres peut exécuter à ce moment-là.

+0

Vous devriez essayer avec un logiciel spécifique, par exemple httperf: httperf --server = 127.0.0.1 --port = 6060 --num-conn = 50 --rate = 10 –

Répondre

2

Ceci est presque certainement une limitation de votre navigateur et pas de CherryPy. Firefox 2, par exemple, ne fera pas plus de 2 requêtes simultanées vers le même domaine, même avec plusieurs onglets. Et si chaque onglet récupère aussi un favicon ... qui laisse un coup à la fois sur votre gestionnaire.

Voir http://www.cherrypy.org/ticket/550 pour un ticket avec un code source similaire, et une preuve plus longue.