threading: Zahl der laufenden Threads beschränken

11/10/2010 - 11:37 von Ole Streicher | Report spam
Hallo Gruppe,

ich möchte gerne für eine bestimmte Thread-Klasse die Maximalzal der
gleichzeitig laufenden Instanzen beschrànkbar machen.

Die Beschrànkung geht offenbar ganz gut mit BoundedSempaphore:
-8<-
import threading

class MyThread(threading.Thread):
pool_sema = UnboundedSemaphore()

def __init__(self, t):
threading.Thread.__init__(self)
self.t = t

def run(self):
with Threaded.pool_sema:
t.run()

@staticmethod
def set_maxthreads(n):
MyThread.pool_sema = threading.BoundedSemaphore(n)
-8<-

Das erste Problem ist jetzt, dass ich gerne per default gar keine Beschrànkung
angeben möchte. Das könnte man mit einer trivialen selbstgeschriebenen Klasse
lösen:

-8<-
class UnboundedSemaphore(object):
def acquire(self, blocking = None):
return None if blocking is None else True

def release(self):
pass
-8<-

aber vielleicht gibt es schon passendes?

Das zweite Problem ist, dass man vielleicht die maximale Threadzahl
anpassen will, wàhrend schon Threads laufen. Der obige Code würde eine
neue Semaphore erzeugen und damit die laufenden Threads nicht mitzàhlen.

Wie könnte man das lösen? Oder versuche ich wieder mal, das Rad neu zu
erfinden? Wie ist dann die saubere Implementation der
Threadbeschrànkung?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 deets
11/10/2010 - 20:38 | Warnen spam
Ole Streicher writes:

Hallo Gruppe,

ich möchte gerne für eine bestimmte Thread-Klasse die Maximalzal der
gleichzeitig laufenden Instanzen beschrànkbar machen.



Der normale Ansatz fuer sowas ist ein Thread-Pool. Du stopfst Aufgaben
in eine Queue, und die Threads arbeiten die ab. Damit hast du nie mehr
Threads laufen, als du moechtest. Du kannst die Threads, die keine
Aufgabe mehr haben, sterben lassen. Dann "respawnst" du eben neue.

Oder du laesst sie rumliegen, bis wieder was zu tun ist. Kostet IMHO
nicht wirklich was.

Sterben + wiederbeleben hat allerdings natuerlich den Vorteil, die
Anzahl der Threads variabel halten zu koennen waehrend des
Programmlaufes. Halte ich aber fuer ueberkandidelt, normalerweise will
man so viele man verkraften kann - und das war's.

Diez

Ähnliche fragen