Domanda

Sto lavorando su un'app django e sto usando cherrypy come server. Cherrypy crea un nuovo thread per ogni visualizzazione di pagina. Mi piacerebbe essere in grado di accedere a tutti questi thread (thread responsabili di parlare con Django) all'interno di ognuno di essi. Più in particolare, vorrei poter accedere a thread_data per ciascuno di questi thread all'interno di uno di essi. È possibile? In tal caso, come posso farlo?

È stato utile?

Soluzione

Il wsgiserver di CherryPy non crea un nuovo thread per ogni richiesta, ma utilizza un pool. Ognuno di questi thread di lavoro è una sottoclasse di threading. Filtra, quindi tutti dovrebbero essere accessibili tramite threading.enumerate ().

Tuttavia, se stai parlando specificamente di cherrypy.thread_data, questo è qualcos'altro: un threading.local. Se stai usando una versione recente di Python, allora tutto ciò che è codificato in C e tu (probabilmente giustamente) non hai accesso cross-thread ad esso da Python. Se veramente ne hai bisogno e davvero sai cosa stai facendo, la tecnica migliore è di solito mettere un riferimento aggiuntivo a tali cose in un contenitore globale allo stesso tempo che vengono inseriti nella struttura thread_data. Raccomando dicts con punti deboli come chiavi per quei container globali - ci sono abbastanza ORM Python che li usano per i pool di connessioni (vedi il mio Geniusql, per esempio) che dovresti essere in grado di imparare come implementarli abbastanza facilmente.

Altri suggerimenti

La mia prima risposta a una domanda come questa non è di dirti come farlo, ma di sottolineare che dovresti davvero riconsiderare prima di andare avanti con questo. Normalmente evito i web server threaded, a favore di soluzioni multi-processo o asincrone. L'aggiunta di comunicazioni inter-thread esplicite al mix aumenta solo quelle paure.

Quando viene posta una domanda come questa, c'è un obiettivo più profondo. Ho il sospetto che ciò che ritieni possa risolvere la comunicazione tra thread possa effettivamente essere risolto in un altro modo più sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top