2016-05-29 3 views
0

Ich stehe vor einem Problem, das leicht zu lösen sein sollte, aber ich fühle, dass ich im Dunkeln klopfe. Ich war einen einfachen Rahmen zu schreiben, die aus den folgenden Klassen bestehen:Wie kann QThreadPool für mehrere umfangreiche Rechenaufgaben verwendet werden?

Zuerst gibt es eine Algorithmus-Klasse, die einfach numerisches Verfahren enthält:

class Algorithm(object): 
. 
. 
. 
@staticmethod 
def calculate(parameters): 
    #do stuff 
    return result 

Dann gibt es ein Element der Klasse, die Pfade zu Dateien hält, Dienstprogramm und Statusinformationen. Ein Arbeiter Klasse Subklassen QRunnable:

class Worker(QRunnable): 
    def __init__(self,item,*args,**kwargs): 
     self.item = item 
    def run(self,*args,**kwargs): 
     result = Algorithms.calculate(items.parameter) 
     item.result = result 

Und in einer Manager-Klasse werden die Prozesse

class Manager(object): 
    def __init__(self,*args,**kwargs): 
     self.pool = QThreadPool() 
     self.pool.setMaxThreadCount(4) 
     self.items = [item1,item2,...] 

    def onEvent(self): 
     for i in self.items: 
      self.pooil.start(item.requestWoker()) #returns a worker 

nun das Problem begann: Nachdem Sie das getan merke ich, 2 Dinge:

  • Die Arbeit ist nicht schneller (sogar ein bisschen langsamer), dann tun Sie es mit 1 Thread
  • Die Elemente erhalten die gleichen Ergebnisse zugewiesen! Zum Beispiel wird Ergebnis A, welches das korrekte Ergebnis für Gegenstand A ist, allen Gegenständen zugewiesen!

Ich konnte hier nicht viel Doku finden, also wo bin ich falsch gelaufen?

Alles Gute Twerp

+1

Sag Hallo zu deinem neuen Freund Gil: https://wiki.python.org/moin/GlobalInterpreterLock –

Antwort

1

Eine Einschränkung der häufigsten Anwendung der Python (CPython) ist, dass seine Parser eine Global Interpreter Lock verwendet, was bedeutet, dass nur ein Thread kann Python werden Parsing-Bytes zu einer Zeit. Es ist möglich, dass mehrere Python-Threads gleichzeitig C-basierte Python-Subroutinen ausführen und mehrere Python-Threads gleichzeitig auf I/O warten, aber nicht gleichzeitig Python-Code ausführen. Aus diesem Grund ist es üblich, beim Multithreading eines CPU-gebundenen Python-Programms keine Beschleunigung zu sehen. Gewöhnliche Problemumgehung besteht darin, Subprozesse anstelle von Threads zu erzeugen (da jeder Subprozess seine eigene Kopie des Python-Interpreters verwendet, sie werden sich nicht gegenseitig stören) oder einige oder alle Python-Programme in einer anderen Sprache neu schreiben Das hat diese Einschränkung nicht.

Verwandte Themen