paul@157 | 1 | #!/usr/bin/env python |
paul@157 | 2 | |
paul@157 | 3 | """ |
paul@157 | 4 | Example of concurrency when reading files. |
paul@157 | 5 | |
paul@157 | 6 | See: http://wiki.python.org/moin/Concurrency/99Bottles |
paul@157 | 7 | |
paul@157 | 8 | Based on the generator version. |
paul@157 | 9 | """ |
paul@157 | 10 | |
paul@157 | 11 | import pprocess |
paul@157 | 12 | import time |
paul@157 | 13 | import re |
paul@157 | 14 | |
paul@157 | 15 | def follow(ch, fname): |
paul@157 | 16 | f = file(fname) |
paul@157 | 17 | f.seek(0,2) # go to the end |
paul@157 | 18 | while True: |
paul@157 | 19 | l = f.readline() |
paul@157 | 20 | if not l: # no data |
paul@157 | 21 | time.sleep(.1) |
paul@157 | 22 | else: |
paul@157 | 23 | ch.send(l) |
paul@157 | 24 | |
paul@157 | 25 | def grep(ch, lines, pattern): |
paul@157 | 26 | regex = re.compile(pattern) |
paul@157 | 27 | for l in lines: |
paul@157 | 28 | if regex.match(l): |
paul@157 | 29 | ch.send(l) |
paul@157 | 30 | |
paul@157 | 31 | def printer(lines): |
paul@157 | 32 | for l in lines: |
paul@157 | 33 | print l.strip() |
paul@157 | 34 | |
paul@157 | 35 | def multigrep(ch, pattern): |
paul@157 | 36 | queue = pprocess.Queue(continuous=1) |
paul@157 | 37 | multifollow = queue.manage(follow) |
paul@162 | 38 | |
paul@162 | 39 | # Launch concurrent following activities. |
paul@162 | 40 | multifollow('/tmp/test') # '/var/log/system.log' |
paul@162 | 41 | multifollow('/tmp/test2') |
paul@162 | 42 | multifollow('/tmp/test3') |
paul@157 | 43 | |
paul@157 | 44 | # Handle incoming lines using the specified pattern. |
paul@157 | 45 | grep(ch, queue, pattern) |
paul@157 | 46 | |
paul@157 | 47 | # Permit multiple simultaneous grep activities. |
paul@157 | 48 | queue = pprocess.Queue(continuous=1) |
paul@157 | 49 | multigrep = queue.manage(multigrep) |
paul@162 | 50 | |
paul@162 | 51 | # Launch concurrent grep activities. |
paul@157 | 52 | multigrep(".*pants.*") |
paul@157 | 53 | multigrep(".*trousers.*") |
paul@157 | 54 | multigrep(".*shorts.*") |
paul@157 | 55 | |
paul@162 | 56 | # Print incoming lines. |
paul@157 | 57 | p = printer(queue) |
paul@157 | 58 | |
paul@157 | 59 | # vim: tabstop=4 expandtab shiftwidth=4 |