Seite 1 von 1

Python Berechnung im Hintergrund laufen lassen

Verfasst: Dienstag 24. Mai 2011, 16:51
von mzh
Hallo zusammen
Ich hab mal ein http://en.wikipedia.org/wiki/Ising_model zusammengebastelt. Das läuft eigentlich recht ok, jetzt dachte ich mir, evtl. kann man da ja etwas Interaktion einbauen. Also, ich stells mal etwas vor.
Die Klasse 'Lattice' stellt das ganze System dar. Davon kann ich ein Objekt erstellen und dann darauf die 'run()' Method aufrufen. Das kann man entweder über einen 'if __name__ == '__main__':..' machen, worin das Objekt erstellt wird und das ganze dann startet, oder interaktiv in der Pythonshell. Die Simulation dauert ja schon eine Weile (je nach dem wie gross die Schrittweite bei der Temperatur gewählt wird).

Code: Alles auswählen

if __name__ == '__main__':
    J = -1.0; S = 1.0; L = 20
    nsteps=40000
    heat = []
    magn = []
    susz = []
    tempRange = arange(0.9, 1.0)
    for t in tempRange:
        print "*"*50, t
        lat = Lattice(J, S, L, t)
        lat.calculateInitialTotalEnergy()
        for step in range(nsteps):
            lat.run(step)
        heat.append(lat.heat(nsteps))
        magn.append(sum(lat.magnet(nsteps)))
        susz.append(lat.susz(nsteps))
und man kann in dieser Zeit eigentlich nicht viel anderes machen als warten. Was ich mich jetzt gefragt habe ist, wie kann ich die ganze Berechnung (in der Pythonshell) beim Start in den Hintergrund schicken und dann einfach wenn ich Lust habe, eine Methode lat.info() starten, die mir den aktuellen Status ausgibt? Das wäre einfach geiler als nur stur den ganzen Output statisch eins nach dem anderen auf den Schirm zu printen.
Wegen der Berechnung, es läuft ein Metropolis Monte Carlo Algorithmus mit dem versucht wird einen Phasenraum aus zwei-wertigen Spins für eine gegebene Temperatur nach Minima abzusuchen.
Also die Frage ist, wie kann ich mit dem Objekt interagieren, während darauf die 'run()' Methode läuft? Weil, wenn ich einfach die 'print' Statements rausnehme, dann startet es zwar, aber dann kommt der Pythonprompt dafür für eine Weile nicht zurück.. also nicht gerade was ich wollte.
Besten Dank für Hinweise.

Re: Python Berechnung im Hintergrund laufen lassen

Verfasst: Dienstag 24. Mai 2011, 21:06
von noisefloor
Hallo,

für Hintergrundprocessing gibt es es Celery.

Allerdings bin ich mir nicht sicher, ob es das wirklich ist, was du willst... Du willst zwar einen Job im Hintergrund, dir bei Bedarf aber den Status anschauen (richtig?). Hört sich eher nach einer Aufgabe für die Shell Befehle fg und bg unter Linux an...

Oder du lässt vom Programm zusätzlich ein Log schreiben, wo du bei Bedarf rein schaust...=

Gruß, noisefloor

Re: Python Berechnung im Hintergrund laufen lassen

Verfasst: Dienstag 24. Mai 2011, 21:33
von deets
@mzh

threading & multiprocessing sind die Antwort. Damit kannst du Berechnungen im Hintergrund machen, und gelegentlich status-informationen auffrischen, die du dann im Vordergrund abfragen kannst.

Re: Python Berechnung im Hintergrund laufen lassen

Verfasst: Dienstag 24. Mai 2011, 21:52
von mzh
Also in etwa würde das so aussehen

Code: Alles auswählen

>>> from calc import Reac
>>> par1 = -1.0
>>> par2 = 20000
>>> mod = Reac(par1, par2)
>>> mod.run()
[beginnt zu rechnen, aber prompt kommt zurück]
>>> mod.info()
Status: 3467 (17.3%) steps done.
Physical Quantity 1: 0.76
Physical Quantity 2: 0.04
>>> mod.setPar1(-1.5)
>>> mod.info()
Status: 3865 (19.5%) steps done.
Physical Quantity 1: 1.2
...
@ deets: ich schau mir das mal an was du meinst.