Python Berechnung im Hintergrund laufen lassen

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
noisefloor
User
Beiträge: 4262
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
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.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Antworten