2010-10-12 13 views
5

Attualmente sono in procinto di scrivere un'app server client come esercizio e ho ottenuto quasi tutto per funzionare finora, ma c'è un ostacolo mentale che non sono stato in grado di con successo google su di me.Python Threading Concept Domanda

Nell'applicazione server sono corretto nel mio modo di pensare che il threading del gestore del pacchetto e del gestore del database funzionino da una pila è la cosa giusta da fare? L'idea è che un thread si accoppi per ascoltare i pacchetti e aggiunge i dati a uno stack e quindi l'altro thread espelle i dati dalla parte inferiore dello stack e esegue alcuni controlli su un db SQL.

In questo caso particolare, è più importante che il gestore di pacchetti continui a funzionare. Suppongo che la mia domanda sia, è un uso appropriato dei thread e dove sto per imbattersi in problemi che richiedono il blocco del thread, ad esempio, dovrei bloccare il gestore db quando il thread del pacchetto si aggiunge allo stack per evitare un problema con il tentativo scrivere e leggere dire, l'unico valore nello stack, ecc.

Grazie a tutti!

Ecco uno snippet del codice, sia chiaro che è in corso quindi non giudicare, anche il mio primo tentativo su python (che sto godendo più di perl o php al momento!).

class socketListen(threading.Thread): 
    def run(self): 
     while True: 
      datagram = s.recv('1024') 
      if not datagram: 
       break 
      packetArray = datagram.split(',') 
      if packetArray[0] = '31337': 
       listHandle.put(packetArray) 
     s.close() 

class stackOperations(threading.Thread): 
    def run(self): 
     while True: 
      #pull the last item off the stack and run ops on it 
      #listHandle.getLast is the last item on the queue 
    def 

class listHandle(): 
    def put(shiftData): 
     if not mainStack: 
      mainStack = [] 
     mainStack.insert(0,shiftData) 
    def getLast: 
     return mainStack.pop() 

risposta

4

Questo è ciò che sono per queues. Sostituisci stack con la coda e no, non dovrai utilizzare altri metodi di sincronizzazione. Per inciso, il multiprocessing è migliore del threading, poiché può sfruttare i processori multicore/hyperthreaded. Le interfacce sono piuttosto simili, quindi vale la pena guardare al passaggio.

+0

No, è perfetto! Devo essere tutto incasinato, però, non sto facendo il multiprocessing? E vuoi dire usare una coda con l'attuale configurazione che ho qui con i thread o passare a un modulo diverso? – Melignus

+0

Il threading è in esecuzione processi contemporaneamente, di solito sulla stessa CPU. La multiprocessing è in esecuzione processi che distribuiscono contemporaneamente il lavoro tra più CPU. Simile, ma distinto. – jathanism

+0

Gotcha, sì ho trovato la pagina dei documenti del modulo multiprocessing proprio ora. Roba buona e ho capito perfettamente. Immagino che stavo immaginando che potrebbe esserci qualcosa in cui l'interprete passa il thread ai core se sono presenti, ma immagino che sia solo un pio desiderio. Un modulo multiprocessing ha un senso. Grazie per l'aiuto ragazzi e le risposte veloci, sei fantastico! – Melignus