Problem with multithreading
larudwer at freenet.de
Thu Jun 25 19:51:10 CEST 2009
"Jeffrey Barish" <jeff_barish at earthlink.net> schrieb im Newsbeitrag
news:mailman.2091.1245902997.8015.python-list at python.org...
> Jeffrey Barish wrote:
>> I have a program that uses multithreading to monitor two loops. When
>> something happens in loop1, it sends a message to loop2 to have it
>> a command. loop2 might have to return a result. If it does, it puts the
>> result in a queue. loop1, meanwhile, would have blocked waiting for
>> something to appear in the queue. The program works for a while, but
>> eventually freezes. I know that freezing is a sign of deadlock.
>> I put in print statements to localize the problem and discovered
>> weird. The freeze always occurs at a point in the code with the
>> print "about to try"
>> print "in try"
>> <do something>
>> I get "about to try", but not "in try". Is this observation consistent
>> the deadlock theory? If not, what could be making the program freeze at
>> the try statement? I wrote a test program using the same techniques to
>> illustrate the problem, but the test program works perfectly. I could
>> post it, though, if it would help to understand what I am doing -- and
>> what might be wrong in the real program.
> As I ponder this problem, I am beginning to believe that the problem is
> related to multithreading. If the problem were due to a collision between
> the two threads then timing would matter, yet I find that the program
> always freezes at exactly the same statement (which executes perfectly
> hundreds of times before the freeze). Moreover, the test program that I
> wrote to test the multithreading implementation works perfectly. And
> finally, there is nothing going on related to multithreading at this point
> in the code. Why else might the program freeze at a try statement?
> Jeffrey Barish
If you have one thread sleeping you need another running thread to waken up
the sleeping thread.
If the running thread terminates unexpectedly the other thread will sleep
Though. Since there is a try statement in your example code and the failure
always happens there,
there might be the chance that some unexpected exception was thrown and
cought somewhere else in your program.
If the Program is terminated, the last print might also have gone lost in
some I/O buffer.
There is no guarantee that the print statement really wasn't executed.
Think about things like
Exception raised when non-blocking get() (or get_nowait()) is called on a
Queue object which is empty.
Exception raised when non-blocking put() (or put_nowait()) is called on a
Queue object which is full.
More information about the Python-list