473,385 Members | 1,341 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

Threading Problem

Hello *,
i am experimenting with threads and get puzzling results.
Consider the following example:
#--------------------
import threading, time

def threadfunction():
.....print "threadfunction: entered"
.....x = 10
.....while x < 40:
.........time.sleep(1) # time unit is seconds
.........print "threadfunction x=%d" % x
.........x += 10

print "start"
th = threading.Thread(target = threadfunction())
th.start()
print "start completed"
#--------------------
(the dots are inserted becaus Google mangles the lines otherwise)

This program gives the following result :
----
start
threadfunction: entered
threadfunction x=10
threadfunction x=20
threadfunction x=30
start completed
----
My aim was that the main program should continue to run while
threadfunction runs in parallel. That's the point of threads after all,
isn't it ?

I awaited something like the following :
start
threadfunction: entered
start completed <-------------------
threadfunction x=10
threadfunction x=20
threadfunction x=30

Does anyone know what's going on here ?

Thanks for listening !

Norbert

Jul 18 '05 #1
7 1166
Norbert wrote:
Hello *,
i am experimenting with threads and get puzzling results.
Consider the following example:
#--------------------
import threading, time

def threadfunction():
.....print "threadfunction: entered"
.....x = 10
.....while x < 40:
.........time.sleep(1) # time unit is seconds
.........print "threadfunction x=%d" % x
.........x += 10

print "start"
th = threading.Thread(target = threadfunction())
th.start()
print "start completed"
#--------------------
(the dots are inserted becaus Google mangles the lines otherwise)

This program gives the following result :
----
start
threadfunction: entered
threadfunction x=10
threadfunction x=20
threadfunction x=30
start completed
----
My aim was that the main program should continue to run while
threadfunction runs in parallel. That's the point of threads after all,
isn't it ?

I awaited something like the following :
start
threadfunction: entered
start completed <-------------------
threadfunction x=10
threadfunction x=20
threadfunction x=30

Does anyone know what's going on here ?


Well, I don't believe there's any guarantee that a thread will get run
preference over its starter - they're both threads, after all. Try
putting a sleep after th.start() and before the print statement and you
should see that the "worker" thread runs while the main thread sleeps.

The same would be true if each were making OS calls and so on. When
everything is more or les continuous computation, and so short it can be
over in microseconds, there's no motivation for the scheduler to stop
one thread and start another.

regards
Steve
--
Steve Holden http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/
Holden Web LLC +1 703 861 4237 +1 800 494 3119
Jul 18 '05 #2
[Norbert]
i am experimenting with threads and get puzzling results.
Consider the following example:
#--------------------
import threading, time

def threadfunction():
....print "threadfunction: entered"
....x = 10
....while x < 40:
........time.sleep(1) # time unit is seconds
........print "threadfunction x=%d" % x
........x += 10

print "start"
th = threading.Thread(target = threadfunction())
The problem is here ^^

You are *invoking* threadfunction, and passing its return value as the
target, rather than passing the function itself as the target. That's
why threadfunction's output appears in the output stream before the
thread has even started.

Try this instead

#-----------------------------------------------

import threading, time

def threadfunction():
print "threadfunction: entered"
x = 10
while x < 40:
time.sleep(1) # time unit is seconds
print "threadfunction x=%d" % x
x += 10

print "start"
th = threading.Thread(target = threadfunction)
th.start()
print "start completed"

#------------------------------------------------

Which should output the expected

start
threadfunction: entered
start completed
threadfunction x=10
threadfunction x=20
threadfunction x=30

regards,

--
alan kennedy
------------------------------------------------------
email alan: http://xhaus.com/contact/alan
Jul 18 '05 #3
Thanks a lot, Steve, for your fast reply.
But the behaviour is the same if 'threadfunction' sleeps longer than
just 1 second. 'threadfunction' is of course a dummy to show the
problem, imagine a longrunning background-task.

If you are right, the question remains 'How can I assure that the
starting function finishes, while the other thread still runs ?' . As
I said, this is the purpose of threading.

Thanks again
Norbert

Jul 18 '05 #4
Thanks Alan,
i hoped it would be something trivial :)

Norbert

Jul 18 '05 #5
Steve Holden wrote:
Well, I don't believe there's any guarantee that a thread will get run preference over its
starter - they're both threads, after all. Try putting a sleep after th.start() and before the
print statement and you should see that the "worker" thread runs while the main thread sleeps.


that's correct, but the "threading" module does a 0.000001-second sleep
to get around this, no matter what thread scheduler you're using.

if you're building threads on top of the lower-level "thread" api, you have
to do that yourself.

</F>

Jul 18 '05 #6
On Wed, 22 Dec 2004 12:55:46 +0000, Alan Kennedy <al****@hotmail.com> wrote:
[Norbert]
i am experimenting with threads and get puzzling results.
Consider the following example:
#--------------------
import threading, time

def threadfunction():
....print "threadfunction: entered"
....x = 10
....while x < 40:
........time.sleep(1) # time unit is seconds
........print "threadfunction x=%d" % x
........x += 10

print "start"
th = threading.Thread(target = threadfunction())


The problem is here ^^

You are *invoking* threadfunction, and passing its return value as the
target, rather than passing the function itself as the target. That's
why threadfunction's output appears in the output stream before the
thread has even started.

Try this instead

#-----------------------------------------------

import threading, time

def threadfunction():
print "threadfunction: entered"
x = 10
while x < 40:
time.sleep(1) # time unit is seconds
print "threadfunction x=%d" % x
x += 10

print "start"
th = threading.Thread(target = threadfunction)
th.start()
print "start completed"

#------------------------------------------------

Which should output the expected

start
threadfunction: entered
start completed
threadfunction x=10
threadfunction x=20
threadfunction x=30

regards,

--
alan kennedy
------------------------------------------------------
email alan: http://xhaus.com/contact/alan


nice chum ;) liked the way you explained. Clear and easy to
understand.. why doesn't the keyboardInterrupt seem to work? I am
working in IDLE and it doesn't seem to stop the thread ???!!??
output of above code in IDLE shell:----

threadfunction x=75

KeyboardInterrupt

threadfunction x=80

--
cheers,
Ishwor Gurung
Jul 18 '05 #7
On Wed, 22 Dec 2004 12:55:46 +0000, Alan Kennedy <al****@hotmail.com> wrote:
[Norbert]
i am experimenting with threads and get puzzling results.
Consider the following example:
#--------------------
import threading, time

def threadfunction():
....print "threadfunction: entered"
....x = 10
....while x < 40:
........time.sleep(1) # time unit is seconds
........print "threadfunction x=%d" % x
........x += 10

print "start"
th = threading.Thread(target = threadfunction())


The problem is here ^^

You are *invoking* threadfunction, and passing its return value as the
target, rather than passing the function itself as the target. That's
why threadfunction's output appears in the output stream before the
thread has even started.

Try this instead

#-----------------------------------------------

import threading, time

def threadfunction():
print "threadfunction: entered"
x = 10
while x < 40:
time.sleep(1) # time unit is seconds
print "threadfunction x=%d" % x
x += 10

print "start"
th = threading.Thread(target = threadfunction)
th.start()
print "start completed"

#------------------------------------------------

Which should output the expected

start
threadfunction: entered
start completed
threadfunction x=10
threadfunction x=20
threadfunction x=30

regards,

--
alan kennedy
------------------------------------------------------
email alan: http://xhaus.com/contact/alan


nice chum ;) liked the way you explained. Clear and easy to
understand.. why doesn't the keyboardInterrupt seem to work? I am
working in IDLE and it doesn't seem to stop the thread ???!!??
output of above code in IDLE shell:----

threadfunction x=75

KeyboardInterrupt

threadfunction x=80

--
cheers,
Ishwor Gurung
Jul 18 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

65
by: Anthony_Barker | last post by:
I have been reading a book about the evolution of the Basic programming language. The author states that Basic - particularly Microsoft's version is full of compromises which crept in along the...
2
by: Egor Bolonev | last post by:
hi all my program terminates with error i dont know why it tells 'TypeError: run() takes exactly 1 argument (10 given)' =program==================== import os, os.path, threading, sys def...
77
by: Jon Skeet [C# MVP] | last post by:
Please excuse the cross-post - I'm pretty sure I've had interest in the article on all the groups this is posted to. I've finally managed to finish my article on multi-threading - at least for...
77
by: Jon Skeet [C# MVP] | last post by:
Please excuse the cross-post - I'm pretty sure I've had interest in the article on all the groups this is posted to. I've finally managed to finish my article on multi-threading - at least for...
11
by: Paul Sijben | last post by:
I am stumped by the following problem. I have a large multi-threaded server accepting communications on one UDP port (chosen for its supposed speed). I have been profiling the code and found...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.