[Tutor] Should I be thinking of threads for this ?

Kent Johnson kent37 at tds.net
Sat Aug 27 15:47:44 CEST 2005


Nick Lunt wrote:
> Hello folks,
> 
> I have the following code taken from the Twisted examples -
> 
> [code]
> # filewatcher.py
> from twisted.application import internet
> 
> def watch(fp):
>         fp.seek(fp.tell())
>         for line in fp.readlines():
>                 sys.stdout.write(line)
> 
> import sys
> from twisted.internet import reactor
> s = internet.TimerService(1.0, watch, file(sys.argv[1]))
> s.startService()
> reactor.run()
> s.stopService()
> [/code]
> 
> I find this piece of code amazing and I am keen to put it to use.
> If I run './filewatcher.py myfile' it will print out any changes made to 
> 'myfile', very similar to 'tail -f' .
> 
> Now if I want to have this program monitor several files at once I could 
> run './filewatcher.py file1 file2 filex' or './filewatcher.py file1 & 
> ./filewatcher file2 & etc' both with minor modifications to the code,  
> but I think that could cause performance problems relating to the OS.
> So I'm thinking I will need to learn python threads (no bad thing) 
> instead, but Im hoping that someone could tell me if that seems the best 
> way to go ?

What performance problems you you anticipate? I don't know much about Twisted but my understanding is that tasks are run in a single thread when they are ready. In your case you are scheduling a simple task to run every second. I would think that you could schedule several such tasks and they would each run every second. If your task were time-consuming you might have to worry about doing something different but in this case I think it will be fine. Just try something like

for name in sys.argv[1:]:
  s = internet.TimerService(1.0, watch, file(name))
  s.startService()

I suppose if you used threads there would be the possibility of a context switch while watch() is running, if one thread becomes blocked on I/O then another thread can run. I don't know how Twisted handles this - I think you have to wrap the file and stdio in Twisted object that handle the blocking. twisted.protocols.basic.FileSender and twisted.internet.stdio.StandardIO look like they may be starting points.

Kent



More information about the Tutor mailing list