You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by Apache Wiki <wi...@apache.org> on 2010/02/08 00:02:29 UTC
[Couchdb Wiki] Trivial Update of "Regenerating_views_on_update" by JamesArthur
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Couchdb Wiki" for change notification.
The "Regenerating_views_on_update" page has been changed by JamesArthur.
The comment on this change is: Ah yes, the actual version.
http://wiki.apache.org/couchdb/Regenerating_views_on_update?action=diff&rev1=6&rev2=7
--------------------------------------------------
import logging
logging.basicConfig(level=logging.INFO)
- import fcntl
import os
import re
+ import signal
import sys
import time
import urllib2
from threading import Thread
+ flags = {
- is_running = True
+ 'is_running': True
+ }
+
changed_docs = {}
class ViewUpdater(object):
@@ -166, +169 @@
]
}
}
-
+
def start(self):
Thread(target=self._run).start()
def _run(self):
"""Loop, checking for enough ``changed_docs`` to trigger a
- request to CouchDB to re-index.
+ request to couchdb to re-index.
"""
- global is_running
- while is_running:
+ while flags['is_running']:
try:
for db_name, number_of_docs in changed_docs.items():
if number_of_docs >= self.MIN_NUM_OF_CHANGED_DOCS:
@@ -195, +197 @@
urllib2.urlopen(url)
time.sleep(self.PAUSE)
except Exception:
- is_running = False
+ flags['is_running'] = False
raise
@@ -210, +212 @@
DB_NAME_EXPRESSION = re.compile(r'\"db\":\"(\w+)\"')
- def __init__(self):
- """Make stdin a non-blocking file
- """
-
- fd = sys.stdin.fileno()
- fl = fcntl.fcntl(fd, fcntl.F_GETFL)
- fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
-
-
-
- def run(self):
+ def _run(self):
"""Consume update notifications from stdin.
"""
- global is_running
- while is_running:
+ while flags['is_running']:
try:
data = sys.stdin.readline()
except:
continue
else:
if not data: # exit
- is_running = False
+ flags['is_running'] = False
break
result = self.DB_NAME_EXPRESSION.search(data)
if result:
@@ -249, +240 @@
+ def start(self):
+ t = Thread(target=self._run)
+ t.start()
+ return t
+
+
+
def main():
@@ -256, +254 @@
consumer = NotificationConsumer()
updater = ViewUpdater()
updater.start()
+ t = consumer.start()
try:
- consumer.run()
+ while flags['is_running']:
+ t.join(10)
except KeyboardInterrupt, err:
- is_running = False
+ flags['is_running'] = False
+