Performance optimierung-> Threading

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Ah okay, ja.
Wenn du das x meinst dann hast du recht.

Habs leider immer noch nicht im Griff.

Code: Alles auswählen

        #pool = Pool()
        for x in self.bodies:
            x.center_of_mass_posxmass = self.center_of_mass.pos
            x.hop_and_log()
        #    pool.apply_async(x.hop_and_log())
        #    p.append(Process(target=x.hop_and_log()))
        #for t in p:
        #    t.start()
        #for t in pool:
        #    t.join()
        #pool.close()
        #pool.join()
Wenn ich einfach nur das async mache habe ich am ende 100000 Threads die das System schrotten. Wenn ich versuche da ein close und join einzubauen geht garnichts mehr.
Das Komisch ist, wenn ich nur 100 Hops simuliere funktioniert es, simuliere ich 1000 geht gar nichts mehr.
BlackJack

@p90: Für asynchron gestartete Funktionen gibt's anscheinend jeweils einen Thread zur Kommunikation mit dem Prozess, der solange besteht, bis das Ergebnis abgefragt wurde. Ich würde die unnötige Ergebnisliste in Kauf nehmen und das ganze Aufteilen `Pool.map()` überlassen (ungetestet):

Code: Alles auswählen

    def next(self):
        for body in self.bodies:
            body.center_of_mass_posxmass = self.center_of_mass.pos
        self.pool.map(lambda b: b.hop_and_log(), self.bodies)
Das `Pool`-Exemplar würde ich in `Bodies.__init__()` erzeugen, dann werden die Prozesse nur einmal gestartet und immer wiederverwendet, statt bei jedem `next()` neue Prozesse zu starten.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Oh man.
Ich geb es auf.
Egal was ich mache, entweder es geht gar nicht oder läuft nur langsam.
Dann doch besser so!
Nochmal danke für die Hilfe!
Antworten