Seite 1 von 1

multiprocessing und Process problem

Verfasst: Freitag 17. September 2010, 18:13
von Normann
Hallo,

ich versuche gerade folgenden Code zum laufen zu bekommen.

Code: Alles auswählen

#!/usr/bin/python2.6
from multiprocessing import Process,Queue
from Queue import Empty
from threading import Thread

import time
import random
import string

class Processing:
        work_queue = Queue()
        stop = False
        count = 0
        start = time.time()
        
        def pudding(self,id): #zum erzeugen von arbeit
                #print 'pudding_start',id
                while not self.stop:
                        text = ''.join(random.choice(string.letters) for i in xrange(8))
                        #print text, id
                        self.work_queue.put((text,id))
                        time.sleep(0.5)
                print 'pudding stopping'
        
        def do_work(self,q,j): #zum abarbeiten
                print 'do_work_start, queue size: ', q.qsize(), ' prozessorID: ', j
                while not self.stop:
                        if self.count == 10000:
                                self.stop = True
                                print time.time()-start, self.count
                        try:
                                x = q.get_nowait()
                                #print x[0],x[1], q.qsize()
                                self.count += 1
                        except Empty:
                                time.sleep(0.1)
                print 'do_work stopping', j
                                
        def prozessor(self,j):
                print 'prozessor', j , 'starten'
                arbeit_schaffen = [Thread(target = self.pudding, args=(i,)) for i in xrange(500)]
                abarbeiten = Thread(target = self.do_work, args=(self.work_queue,j,))
                for p in arbeit_schaffen:
                        p.start()
                abarbeiten.start()
                print 'prozessor', j , 'gestartet'
                
        def start(self):
                prozessor = [Process(target = self.prozessor, args=(j,) ) for j in range(2)]
                for p in prozessor:
                        p.start()
                
                print 'gestartet'
                for p in prozessor:
                        p.join()

start = time.time()
test= Processing()
test.start()
print time.time() - start
Ziel ist es auf 2 Prozessoren je 500 Threads zu starten welche Arbeit erzeugen und je einen der das ganze abarbeiten soll.
Die Arbeit soll in eine globale queue geschrieben werden.
Problem ist jetzt, dass dass die Prozesse einfach durchlaufen und das Programm beendet wird ohne das die benötigte Menge abgearbeitet wurde.
Bashausgabe hierzu:
prozessor 0 starten
prozessor 1 starten
gestartet
do_work_start, queue size: 546 prozessorID: 1
prozessor 1 gestartet
do_work_start, queue size: 497 prozessorID: 0
prozessor 0 gestartet
0.771878957748
Habt ihr eine Idee was ich da vergessen habe?
Desweiteren bin ich auf multiprocessing.Pool in der Doku gestoßen, nur ist dies dort mangelhaft erklärt. Könnte mir das evtl. helfen?

Danke Normann

Re: multiprocessing und Process problem

Verfasst: Freitag 17. September 2010, 18:48
von BlackJack
@Normann: Leitest Du irgendwelche Ausgaben um? Ich bekomme da nämlich noch Fehlermeldungen:

Code: Alles auswählen

bj@s8n:~$ python2.6 forum6.py
prozessor 0 starten
prozessor 1 starten
gestartet
Process Process-2:
Traceback (most recent call last):
  File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap
    self.run()
  File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "forum6.py", line 44, in prozessor
    p.start()
  File "/usr/lib/python2.6/threading.py", line 471, in start
    _start_new_thread(self.__bootstrap, ())
error: can't start new thread
Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap
    self.run()
  File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "forum6.py", line 44, in prozessor
    p.start()
  File "/usr/lib/python2.6/threading.py", line 471, in start
    _start_new_thread(self.__bootstrap, ())
error: can't start new thread
0.818915128708

Re: multiprocessing und Process problem

Verfasst: Freitag 17. September 2010, 18:57
von Normann
nein, es hängt vom system ab wieviele threads man starten kann afaik
"error: can't start new thread"
so wie es da steht versucht, er 1003 thread zu starten.
evtl. von 500(zeile 2 in prozessor) auf 50 stellen oder weniger.

Re: multiprocessing und Process problem

Verfasst: Freitag 17. September 2010, 19:18
von BlackJack
@Normann: Okay, dann kommt das Programm bei mir unterschiedlich weit bei verschiedenen Aufrufen.

Ich würde mal sagen Du musst in `prozessor()` auch warten bis die Arbeit erledigt ist, sonst werden die Prozesse einfach gekillt wenn der Hauptthread fertig ist. Und da ist es anscheinend egal ob noch andere Threads laufen. Was auch bedeutet, dass Du `do_work()` nicht unbedingt in einem eigenen Thread starten musst. Das kann ja auch im Hauptthread vom Prozess laufen.

Re: multiprocessing und Process problem

Verfasst: Freitag 17. September 2010, 20:30
von Normann
das war auch meine idee, aber das kann doch nicht die lösung sein oder?
bei threads kann ich das ja mit setdeamin steuern gibt es denn sowas evtla uch bei processen?

Re: multiprocessing und Process problem

Verfasst: Freitag 17. September 2010, 20:38
von BlackJack
@Normann: Was spricht gegen die Lösung? Die bekommst Du ja im Grunde frei Haus, wenn Du `do_work()` nicht in einem eigenen Thread laufen lässt. Ein unnötiger Thread weniger.

Re: multiprocessing und Process problem

Verfasst: Samstag 18. September 2010, 14:48
von Normann
hmm das wäre eine Möglichkeit nur wollte ich eigentlich auf jedem prozessor einen worker haben. und im hauptthread andere sachen machen lassen.
zufrieden bin ich mit der sache aber nicht wiel das problem ja eigentlich nicht gelößt ist.

Re: multiprocessing und Process problem

Verfasst: Samstag 18. September 2010, 19:42
von BlackJack
@Normann: Das verstehe ich jetzt nicht!? Es ändert sich doch dadurch nicht wirklich etwas. Der "Hauptthread" von einem Prozess ist an sich ja nichts besonderes, also ob Du in dem innerhalb jedes Prozesses `do_work()` ausführts oder in einem extra `Thread` macht doch keinen Unterschied. Welches Problem ist damit also nicht gelöst?