Mac + Threads +os calls = ???

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
js84
User
Beiträge: 2
Registriert: Dienstag 2. März 2010, 01:27

Hallo,
wir hatten hier ein Problem mit Threads auf Mac.
Auf dem Mac läuft mit Python 2.5.1 der Code Sequentiel ab (aber auch nur wenn der os call mit drin ist),
Auf Linux (Python 2.6) läuft das alles wie es sollte (-> parallel).

Ist da irgentwas bei uns falsch oder ist das ein bekannter Issue?

Code: Alles auswählen

#!/usr/bin/python

import os, thread, time
from datetime import datetime;

def counter(myId, count):
    nb[myId] = myId
    print 'Starting thread %s' %(nb[myId])
    for i in range(count):
        #time.sleep(1)
        os.system("sleep 5") 
        print 'thread number %d reporting in at %d...' % (myId, time.clock())
    print 'Exiting thread %s' %(nb[myId])
    exit[myId] = 0

# Starting time
timeStarted = datetime.now();

exit = []
nb = {}
for i in range(5):
    exit.append(1)
    thread.start_new(counter, (i, 1))

# Runtime
timeEnded = datetime.now();
runTime = timeEnded - timeStarted

while 1 in exit: pass
print 'all threads finished in %s!' %(runTime)


nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Wenn du aus dem os.system("sleep 5") ein time.sleep(5) machst, sollte es "parallel" laufen, wobei du aufpassen solltest, für was du threading wirklich verwendest, da dort nicht wirklich was parallel läuft und die Performance nur in manchen Fällen verbessert wird - nicht selten verschlechtert.
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

Stimmt, ein Prozessor kann nicht mehrere Dinge wirklich parallel ausführen (so wie unser Gehirn), sondern immer nur schnell hintereinander wechseln, dass kann zu zugriffsproblemen usw. führen (aber das weißt du sicher).
MfG DeKugelschieber
Dackel
User
Beiträge: 11
Registriert: Mittwoch 4. März 2009, 20:44

Wenn man von einem Multicore-System ausgeht, schon. Allerdings ist Python-Threading durch das GIL ja nicht Mehrkern-fähig. Will man mehrere CPUs mit Python auslasten, modelliert man besser mehrere Prozesse.

Gerade auf dem Mac können Python-Threads die Performance eines Programmes sehr schnell runterziehen. Der GIL-Talk von David Beazley (er hat seine Test auf einem Mac durchgeführt, die meisten Probleme existieren aber generell unter CPython) ist da sehr aufschlussreich: http://python.mirocommunity.org/video/1 ... python-gil
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

ja ich bezog mich jetzt auf einen kern.
MfG DeKugelschieber
js84
User
Beiträge: 2
Registriert: Dienstag 2. März 2010, 01:27

Hallo,
danke erstmal für die vielen Antworten.
Das

Code: Alles auswählen

os.system("sleep 5")
steht bei uns nur leider für einen anderen system call der sich lohnt zu parallel ausgeführt zu werden.
Ich werde mir den unten genannten Talk erstmal anschauen und es läuft ja auch wie gewünscht auf dem Linux Server wo es auch hin sollte. War halt nur ein sehr zeitaufwändiges issue letzte Nacht.

So gesehen noch mal Danke!
Antworten