Embedded Python : Why does thread lock here?
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Tue Jul 7 19:44:45 EDT 2009
En Tue, 07 Jul 2009 15:01:17 -0300, roschler <robert.oschler at gmail.com>
escribió:
> I have the Python Intepreter embedded in a Delphi (Object Pascal)
> program. In the Python script shown below, I have a module that
> creates a thread object and starts it.
Do you *execute* the module or do you *import* it?
Isn't a good idea to spawn a thread by side effect of importing a module.
> The thread's run() call calls
> a function called deleteOutputVariables() declared at the module
> level. In my code's first incarnation the thread's run() call would
> deadlock when trying to call the deleteOutputVariables() function
> declared at Module level. I would never see the statement
> "(deleteOutputVariables) Top of Call" printed to the screen. I now
> know that I must periodically call join() with a very fast time-out to
> keep Python threads happy, and that solved the problem.
What does the Delphi code? Isn't a join with a long timeout enough?
> However I am
> curious as to why it deadlocked at the deleteOutputVariables() call?
> Is it because deleteOutputVariables() is declared at the module level
> or because that function deletes module level variables? If so why?
I don't know, but you can make some experiments - move te
deleteOutputVariables as a method, or don't delete module level variables
at all, and see what happens. I'd say both factors are irrelevant.
> # FUNCTION: Delete the variables given in the list.
> def deleteOutputVariables(theModule, theOutputVariablesListOfNames):
> try:
> print "(deleteOutputVariables) Top of call."
> for theOutputVariableName in theOutputVariablesListOfNames:
> if theModule.__dict__.has_key(theOutputVariableName):
> print "(Python::deleteOutputVariables) Deleting the
> Output Variable named " + theOutputVariableName
> del theModule.__dict__[theOutputVariableName]
> except:
> print "(deleteOutputVariables) Exception occurred."
As a rule, avoid using __special__ names. There is almost never need of
using them (__init__ is a notable exception) unless you want to change
Python behaviour.
In this case:
for theOutputVariableName in theOutputVariablesListOfNames:
if hasattr(theModule, theOutputVariableName):
delattr(theModule, theOutputVariableName)
(a name like theOutputVariablesListOfNames is too long for my taste, but
that's a matter of style...)
> theNewThread = None
> theNewThread = threadRun("TestThread")
That first line is useless...
--
Gabriel Genellina
More information about the Python-list
mailing list