How to increase number of threads per process?
Steve
nospam at nopes
Tue Jul 13 03:00:32 EDT 2004
Ronan,
Ronan Viernes wrote:
> Hi,
>
> I have created a python script (see below) to count the maximum number
> of threads per process (by starting new threads continuously until it
> breaks).
>
> ######
> #testThread.py
> import thread, sys
>
> def main():
> print "Main Thread:", thread.get_ident()
> count = 0;
> try:
> while 1:
> thread.start_new_thread(test,(`count`,))
> count = count + 1;
> except:
> print "Total Threads:", count
> print "Exiting Main Thread:", thread.get_ident()
> raise
>
> def test(input=None):
> print "count:", thread.get_ident(), input
> while 1: #keep thread alive until it breaks
> pass
>
> if __name__ == "__main__":
> main()
>
> #####
>
> Results:
>
> 1. SuSE Professional 7.1 (Kernel 2.4.18), Python 1.5.2
> Max Threads = 1024
>
> 2. SuSE Professional 7.1 (Kernel 2.4.18), Python 2.0
> Max Threads = 1024
>
> 3. SuSE Enterprise Server 8.0 (Kernel 2.4.18), Python 1.5.2
> Max Threads = 256
>
> 4. SuSE Enterprise Server 8.0 (Kernel 2.4.18), Python 2.2
> Max Threads = 512
>
> Note:
> For all setup, SuSE Linux threads-max=14336 and max_map_count=65536
>
> Questions:
> 1. How to determine the number of threads? Is it something
> configurable?
> 2. Why do the results above differ in output?
> 3. How to increase the maximum number of threads per process?
>
I'm not sure if this is configurable but I was testing out something
similar today (on fedora core 1). I discovered that a structure such as
the following works with any number of thread (I tried it with 2000
threads just now). The main thing I did was introducing a
'time.sleep(0.01)' in the loop that waits for the worker threads to join
the main thread, and adding a try..except clause around where you start
the threads. Basically an exception is never thrown because I run 10
threads at one go, and then sleep for a fraction of a second (it's
usually a good idea to sleep/yield in busy loops). I think the main
thing here is the fact that it takes 10 threads at a time and then gives
it a pause.
Please try this out and let me know what you find.
class A:
cache = {}
counter = 0
def local(self):
A.cache[A.counter*2] = A.counter
A.counter += 1
def print_it(self):
print A.cache, len(A.cache), A.counter
def test():
count = 2000 # I'm pretty sure a larger number should work too
a = A()
threadList = []
for i in xrange(count):
try:
t = threading.Thread(target=a.local, args=())
threadList.append(t)
t.start()
# Adding the following if statement allowed running more
than 256 threads in one go
# Previously it would run only 256 threads if this clause
wasn't there.
if i % 10 == 0 and i != 0:
# setting sys.setcheckinterval to 1 didn't help. Let's try
# voluntarily giving up some cycles -- this should give
# other threads a chance to run
time.sleep(0.01) # this works with time.sleep(0.005)
as well
# end if
except:
continue
# end try
# end for
# Wait for threads to join the main thread
while threading.activeCount()>1:
time.sleep(1)
a.print_it()
test()
>
> Thanks and hope to hear soon.
> Ronan
Steve
More information about the Python-list
mailing list