realtime design

Dennis Lee Bieber wlfraed at ix.netcom.com
Tue Oct 15 04:44:56 CEST 2002


Will Stuyvesant fed this fish to the penguins on Monday 14 October 2002 
07:29 am:

> 
> What I am going to look into is how to write a function that will
> start the target function in another *process* in Windows, and use a
> default value if the process does not finish in time.
> Any ideas?
>
        Not easy either -- Windows itself doesn't support many ways for a 
parent to wait on a sub-process ("Python Standard Library" indicates 
that os.system() waits, but my experience says it didn't). os.spawnv() 
has a WAIT mode, but then you are stuck just like in a thread...

        If you do NOWAIT, you could set up a timer... But again Windows 
doesn't have an easy way to kill the process (or I couldn't find it -- 
UNIX/Linux support os.kill(pid)). And you've no doubt seen just how 
long it takes from using the task manager (ctrl-alt-del) to pick a 
process to kill, until the "program is not responding..." pop-up.

        You'd also have the difficulty of how to get the result returned to 
you. Oh, besides having to write the "function" as a stand-alone main 
program.

        (Oh, I should clarify -- I do NOT know what is available in the win32 
extension package regarding process control; my book is on loan <G>)


        So... while I can visualize a scheme in which I can properly select 
which return is valid, I can not kill off the incomplete thread, and 
also have the restriction that a second call is unsafe before all of 
the first one has finished (well, I may have a work around for that too)

... a half hour later... (hope the formatting survives -- ignore the 
KNode "box")


,----[ /home/wulfraed/tt.py ]
| from time import sleep
| import threading
| import Queue
| 
| 
| def Worker(*args, **kwargs):
|     retq = kwargs["retq"]
|     func = kwargs["ToDo"]
|     del kwargs["retq"]
|     del kwargs["ToDo"]
|     retq.put(func(*args, **kwargs))
| 
| def rcall(ms, func, *ar, **kw):
|     q = Queue.Queue()
|     kw["retq"] = q
|     kw["ToDo"] = func
|     w = threading.Thread(target=Worker, args=ar, kwargs=kw)
|     w.start()
|     w.join(float(ms) / 1000.0)
|     if q.empty():
|         return "TimeOut"    #   leaves a dangling Queue and Worker 
Thread
        # had a line wrap on the comment, beware!
|     else:
|         return q.get()
| 
| 
| 
| #   dummy func
| 
| def dfunc(ms):
|     sleep(float(ms) / 1000.0)
|     return "dfunc is Defunct"
| 
| if __name__ == "__main__":
|     print rcall(10, dfunc, 5)
|     print rcall(10, dfunc, 50)
|     print rcall(50, dfunc, 50)
|     print rcall(50, dfunc, 49)
|     print rcall(50, dfunc, 51)
|     

`----

        
> 
> and-now-I-am-thinking-about-how-to-kill-a-Windows-process-ly y'rs
> 
> 
> '''
> Multithreading will rot your teeth.
>                 -- Michael Swaine
> '''

-- 
--  
 > ============================================================== <
 >   wlfraed at ix.netcom.com  | Wulfraed  Dennis Lee Bieber  KD6MOG <
 >      wulfraed at dm.net     |       Bestiaria Support Staff       <
 > ============================================================== <
 >        Bestiaria Home Page: http://www.beastie.dm.net/         <
 >            Home Page: http://www.dm.net/~wulfraed/             <



More information about the Python-list mailing list