Mit Python Dual Core nutzen

Ich will mit Python beide Prozessoren nutzen und habe zum Test mal ein kleines Primzahlprogramm geschrieben:
Code:
import thread
import time
def is_prim(n):
    if n % 2 == 0:
        return False
    i = 3
    while i * i <= n:
        if n % i == 0:
            return False
        i += 2
    return True
def check_bereich(start, stop):
    for i in range(start, stop):
        if is_prim(i):
            #print i                                                                                                                                           
            pass
    global a
    a -= 1
a = 3
check_bereich(2,40000)
print time.clock()
thread.start_new_thread(check_bereich, (2,20000,))
thread.start_new_thread(check_bereich, (20001,40000))
while a > 0:
    pass
print time.clock()
Theoretisch müsste der Teil mit den 2 Prozessoren doch schneller sein oder? Hat einer ne Ahnung wo der Fehler ist?
 
Die Primzahlprüfung dauert für große Zahlen länger als für kleine, also wird der erste Thread weit vor dem zweiten fertig sein. Zudem hast du im Hauptprogramm eine Endlosschleife, die auch noch ordentlich Rechenleistung vergeudet.
 
Hast recht ich hab den Code mal ein wenig umgebaut und es werden beide Threads gleichzeitig ausgeführt. Die Endlosschleife muss sein denn wenn ein Theard zuende ist würde er sonst das ganze Programm beenden. Wenn du ne elegantere Lösung hast, bitte sag es mir. Ich habe es nur wie im Openbook gemacht
 
Also zumindest mal ein sleep in die Schleife setzen. Und es müsste auch die Möglichkeiot geben, auf einen Thread zu warten, dafür kenn ich mich aber zu wenig mit python aus.
 
Wenn ich mich nicht irre, ist bei Python in einer Interpreterinstanz stets der GIL und nochmal GIL aktiv.
Dadurch sind mehrere Threads auf mehreren Cores mit dem Modul thread / threading nicht möglich.
Es gibt aber das Modul multiprocessing ab Version 2.6(?). (Davor hieß es afair pyprocessing X( ). Damit sollts möglich sein, aber dann wird jeder "Thread" als eigenständiger Prozess geführt; heißt Thread + Interpreter. Bei vielen Threads gibts damit wohl großen Overhead.


mfg

ps. Beim Modul thread scheints keine fertige Möglichkeit zu geben, Threads auf einander warten zu lassen. Das Modul threading bietet dafür die Methode .join() an.

pps. Ich hoffe, dass das so noch aktuell ist mit dem GIL und Mehrkernern...
 
Zurück
Oben