Nieuws:

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

Auteur Topic: [OPGELOST] Python: Aansturing multi-core processors  (gelezen 1136 keer)

Offline MKe

  • Lid
[OPGELOST] Python: Aansturing multi-core processors
« Gepost op: 2010/02/01, 21:34:48 »
Hoi,

Als beginnend python programmeur (wel ervaring in .net) liep ik tegen een probleem aan. Ik heb een aantal langdurige processen. Om de rekentijd te verkorten wil ik graag beide cores van mijn processor gebruiken. Ik heb begrepen dat threads (wat je zou doen in .net) in Python niet de goede manier hiervoor zijn, omdat die niet echt parallel uitgevoerd worden. Ik moet dus meerdere processen starten. Voorwaarde hierbij is dat ik niet meer processen tegelijk wil laten lopen dan er cores zijn, in dit geval 2. Om te oefenen heb ik het volgende progje geschreven:
#!/usr/bin/env python
from multiprocessing import Process
import time

#de functie die in de processen gebruikt wordt:
def f(name, tijd):
    for i in range(30):
      time.sleep(tijd)    
      print name," ", str(i)

p=[] #lijst van processen
for i in range(2):  #maak 2 processen aan
   #Thread1 geeft elke 1 seconde een waarde, thread 2 elke 2 seconden etc
   p.append(Process(target=f,args=('Thread'+str(i),i+1)))

#er moet 10x een process worden gestart
for i in range(10):
   while True:    
      for t in p: #kijkt of er een thread vrij is
         if t.is_alive()==False:
              t.start() #eerste 2 processen starten goed, daarna foutmelding
              break #stop de infinite while-lus als een thread gestart wordt
Dit programma geeft een foutmelding omdat een proces niet 2 keer gestart kan worden. Een nieuw proces aan de variabele toewijzen, zoals in .net kan, mag ook niet van python. Weet iemand een oplossing?
« Laatst bewerkt op: 2010/02/02, 14:53:52 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline MartijnB

  • Lid
    • http://www.mbastiaan.nl
Re: Python: Aansturing multi-core processors
« Reactie #1 Gepost op: 2010/02/01, 22:02:19 »
Gebruik threading. Een tijd geleden heb ik dit ook op een ander forum gevraagd. Succes!

Offline Ronnie

  • Lid
    • ronnie.vd.c
Re: Python: Aansturing multi-core processors
« Reactie #2 Gepost op: 2010/02/01, 22:51:21 »
Ik ben ook geen held in het programmeren (nog nooit met multi-core gewerkt). Na een tijdje zitten puzzelen, ben ik hierop gekomen
#!/usr/bin/env python
from multiprocessing import Process
import time

#de functie die in de processen gebruikt wordt:
def f(name, tijd):
    for i in range(5):
        time.sleep(tijd)   
        print name," ", str(i)

p=[None, None] #lijst van ==>processors<==

#er moet 10x een process worden gestart
for i in range(10):
    running = True
    while running:
        for t in range(len(p)): #kijkt of er een thread vrij is
            if not p[t] or not p[t].is_alive():
                p[t] = Process(target=f,args=('Thread'+str(i),i+1))
                p[t].start() #eerste 2 processen starten goed, daarna foutmelding
                running = False # deze zorgt ervoor dat je uit de while lus breekt
                break #stop de infinite while-lus als een thread gestart wordt ==> nee, breekt uit de for-lus
        time.sleep(0.1) # zorgt voor minder overhead in de while lus

Het werkt, maar ik weet niet of het de goede manier is
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Documentatie Terminal

Offline MKe

  • Lid
Re: Python: Aansturing multi-core processors
« Reactie #3 Gepost op: 2010/02/02, 12:09:13 »
Gebruik threading. Een tijd geleden heb ik dit ook op een ander forum gevraagd. Succes!
Multi-threading werkt niet, python heeft een lock, waardoor de verschillende threads niet op verschillende cores worden uitgevoerd.

@Ronnie: Dat werkt, bedankt!