Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Opgelost] Python: threads  (gelezen 2911 keer)

Offline MataS

  • Lid
[Opgelost] Python: threads
« Gepost op: 2009/03/12, 20:57:16 »
Hallo,

Twee vraagjes:
1) Heeft het nut om in python meerdere threads te hebben. Worden de prestaties van het programma dan beter op een dual/quad/etc.-core processor?
Ik las op internet iets over python's "Global Interpreter Lock" en dat doet vermoeden van niet :(

2) Kun je in python erachter komen hoeveel threads de processor heeft om daarop het aantal threads (of als dat geen nut heeft, het aantal externe processen) aan te passen?

Alvast bedankt
« Laatst bewerkt op: 2009/03/15, 17:27:02 door MataS »

Offline peter10

  • Lid
    • Mijn Hyve
Re: Python: threads
« Reactie #1 Gepost op: 2009/03/13, 00:47:54 »
Ik heb geen verstand van Python, maar multithreading zou verschil moeten maken. Het verdere hoe & wat: geen idee.  :)

Offline idefix

  • Lid
Re: Python: threads
« Reactie #2 Gepost op: 2009/03/13, 11:08:56 »
Het heeft alleszins nut:

kijk hier voor een voorbeeld
of hier

Edit: links aangepast. Bedankt, Nunslaughter
« Laatst bewerkt op: 2009/03/13, 13:45:01 door idefix »
Support bacteria. They're the only culture some people have.

Re: Python: threads
« Reactie #3 Gepost op: 2009/03/13, 11:36:10 »
idefix: Controleeer even uw links, ge hebt een dubbele http:// en uw links staan tussen quotes.

Offline idefix

  • Lid
Re: Python: threads
« Reactie #4 Gepost op: 2009/03/13, 13:45:34 »
idefix: Controleeer even uw links, ge hebt een dubbele http:// en uw links staan tussen quotes.

Done. Merciekes!  ;)
Support bacteria. They're the only culture some people have.

Offline MartijnB

  • Lid
    • http://www.mbastiaan.nl
Re: Python: threads
« Reactie #5 Gepost op: 2009/03/13, 16:59:59 »
Dit maakt zeker uit! Basis:
#!/usr/bin/python
import time
import threading
from functools import partial

def foo(intreger):
   time.sleep(intreger)
   return str(intreger)

def print_foo(nr):
    print foo(nr)

threading.Thread(target=partial(print_foo, 1)).start()
threading.Thread(target=partial(print_foo, 2)).start()
Het programma 'exit' pas, als alle 2 de threads klaar zijn.

Offline MataS

  • Lid
Re: Python: threads
« Reactie #6 Gepost op: 2009/03/13, 17:16:52 »
ok, dankjewel, dan ga ik threads gebruiken

nou alleen nog het punt hoeveel ...
kun je er in python achter komen wat het ideale aantal threads is (ofwel het aantal taken dat de processor tegelijk uit kan voeren)?

Offline MartijnB

  • Lid
    • http://www.mbastiaan.nl
Re: Python: threads
« Reactie #7 Gepost op: 2009/03/15, 13:15:03 »
Je kunt het beter per core verdelen, anders ga je het systeem opstoppen =D. Ik heb wat voor je geschreven; het geeft het aantal cores weer in een systeem (ik heb het niet getest op een systeem met >1 processor, maar volgens mij moet het werken).

def detectCores():
    """Detect the number of CPU-cores on a system"""
    import os
   
    if os.environ.has_key("NUMBER_OF_PROCESSORS"):
        nCores = int(os.environ["NUMBER_OF_PROCESSORS"]);
        if nCores > 0:
            return nCores
   
    if hasattr(os, "sysconf"):
        if os.sysconf_names.has_key("SC_NPROCESSORS_ONLN"):
            # If we're running Linux (or any UNIX variant)
            nCores = os.sysconf("SC_NPROCESSORS_ONLN")
        if isinstance(nCores, int) and nCores > 0:
            return nCores
        else:
            # If we're running MAC OS
            return int(os.popen2("sysctl -n hw.ncpu")[1].read())
   
    # When all hope is lost, return 1
    return 1

if __name__ == '__main__':
    print(detectCores())

Offline MataS

  • Lid
Re: Python: threads
« Reactie #8 Gepost op: 2009/03/15, 17:26:30 »
Ja dankjewel :)

Re: [Opgelost] Python: threads
« Reactie #9 Gepost op: 2009/03/15, 17:28:54 »
Maar threads hebben toch weinig te maken met het aantal cores dat ge hebt? Ge kunt toch gerust 20 threads draaien op een single core cpu?

Offline Floris

  • Lid
Re: [Opgelost] Python: threads
« Reactie #10 Gepost op: 2009/03/15, 18:09:36 »
Maar threads hebben toch weinig te maken met het aantal cores dat ge hebt? Ge kunt toch gerust 20 threads draaien op een single core cpu?
Dat kan inderdaad, maar met meerdere kernen levert het meer op; als je meerder threads op één kern draait, dan moeten ze serieel—achter elkaar—uitgevoerd worden; als je, bijvoorbeeld, twee threads over twee kernen verdeelt, dan kunnen ze parallel—echt tegelijkertijd—uitgevoerd worden.  Meerdere kernen levert dus meer tijdwinst op; houd er ook rekening mee dat het beheer van meerdere threads ook weer overhead met zich mee brengt, daardoor wordt het zelfs twijfelachtig of 20 threads op één kern wel altijd winst oplevert…
Als je vraag beantwoord is, wees dan zo vriendelijk om de titel van je eerste post met "[OPGELOST]" te beginnen (klik op verander).

Re: [Opgelost] Python: threads
« Reactie #11 Gepost op: 2009/03/15, 18:42:50 »
Als we het voorbeeld van hierboven nemen: http://www.wellho.net/solutions/python-python-threads-a-first-example.html

Dat zijn 10 threads. Zonder threads duurt het 28 seconden, met threads duurt het 3 seconden. Hij zal het toch niet op een 10 kernen processor getest hebben?

Offline MataS

  • Lid
Re: [Opgelost] Python: threads
« Reactie #12 Gepost op: 2009/03/15, 20:01:09 »
In dat voorbeeld wordt een ping-opdracht uitgevoerd. Bij een ping is de processor niet constant bezig, het langste duurt het om te wachten tot de ping wordt beantwoord. Waar ik het voor wil gebruiken (foto's schalen) is de processor veel meer bezig, daarbij kost het alleen maar tijd om met (te) veel threads per kern te draaien.

Offline MartijnB

  • Lid
    • http://www.mbastiaan.nl
Re: [Opgelost] Python: threads
« Reactie #13 Gepost op: 2009/03/15, 21:17:54 »
Houd er rekening mee dat je de foto's niet tegelijk laad van de harde schijf, dit kan het programma onnodig vertragen (hoewel dit bij SSD's niet meer hoeft). Ik zou zelf gebruik maken van een lock. Succes in ieder geval!  ;)