Problem mit threading

Code-Stücke können hier veröffentlicht werden.
Antworten
theinfmonkey
User
Beiträge: 7
Registriert: Dienstag 24. August 2010, 08:59

Um für ein anderes Projekt zu üben habe ich mir eine kleine Fingerübung für Multicore-Prozesse gebastelt:

Code: Alles auswählen

import threading
import timeit
import multiprocessing



class LoopThread(threading.Thread):

    "definition of a single thread checking a list for primes"

    def __init__(self, nodes):

        threading.Thread.__init__(self)
        self.nodes = nodes

    def run(self):

        primes = []
        for n in self.nodes:
            if self.is_prime(n):
                primes.append(n)
        #print primes

    def is_prime(self, p):
        i = 2
        while i*i < p:
            if p % i == 0:
                return False
            i += 1
        return True



class ThreadStarter(object):

    "splits list according to number of CPUs an runs threads"

    def __init__(self, lst):
        l = len(lst)
        if multiprocessing.cpu_count() == 2:
            self.lsts = (lst[:l/2], lst[l/2:])
        if multiprocessing.cpu_count()== 4:
            self.lsts = (lst[:l/4], lst[l/4:l/2], lst[l/2:3*l/4], lst[3*l/4:])

    def run(self):
        threads = []
        for l in self.lsts:
            thread = LoopThread(l)
            threads.append(thread)
            thread.start()
        for t in threads:
            thread.join()
        return True



if __name__ == "__main__":

    def run_multithread():
        lst = range(1000)
        starter = ThreadStarter(lst)
        starter.run()

    def run_singlethread():
        lst = range(1000)
        thread = LoopThread(lst)
        thread.start()
        thread.join()

    t1 = timeit.Timer("run_multithread()", "from __main__ import run_multithread")
    print "multithread : ", t1.timeit(1000)

    t2 = timeit.Timer("run_singlethread()", "from __main__ import run_singlethread")
    print "singlethread: ", t1.timeit(1000)
Ausgabe:

Code: Alles auswählen

multithread :  2.88458013535
singlethread:  2.90721392632
Warum ist die Multithread-Variante nicht schneller?

Weiss jemand die Antwort? Vielen Dank.
Anfänger.
BlackJack

@theinfmonkey: Weil bei CPython immer nur ein Thread gleichzeitig Python-Bytecode ausführen kann. Stichwort: `Global Interpreter Lock` (GIL).

Edit: Du scheinst ein wenig zu klassenfixiert zu sein -- beide Klassen sind IMHO unnötig und könnten durch einfache Funktionen ersetzt werden.
Antworten