Author: cito
Date: Sun Jan 6 15:53:43 2013
New Revision: 508
Log:
Make listen and notify be usable from outside by using a lock.
Modified:
trunk/module/pg.py
Modified: trunk/module/pg.py
==============================================================================
--- trunk/module/pg.py Sun Jan 6 15:28:59 2013 (r507)
+++ trunk/module/pg.py Sun Jan 6 15:53:43 2013 (r508)
@@ -32,6 +32,7 @@
import select
import warnings
+from threading import Lock
try:
frozenset
except NameError: # Python < 2.4
@@ -165,6 +166,7 @@
arg_dict = {}
self.arg_dict = arg_dict
self.timeout = timeout
+ self.lock = Lock()
def __del__(self):
self.close()
@@ -177,22 +179,35 @@
def listen(self):
if not self.listening:
- self.db.query('listen "%s"' % self.event)
- self.db.query('listen "%s"' % self.stop)
- self.listening = True
+ self.lock.acquire()
+ try:
+ self.db.query('listen "%s"' % self.event)
+ self.db.query('listen "%s"' % self.stop)
+ self.listening = True
+ finally:
+ self.lock.release()
def unlisten(self):
if self.listening:
- self.db.query('unlisten "%s"' % self.event)
- self.db.query('unlisten "%s"' % self.stop)
- self.listening = False
+ self.lock.acquire()
+ try:
+ self.db.query('unlisten "%s"' % self.event)
+ self.db.query('unlisten "%s"' % self.stop)
+ self.listening = False
+ finally:
+ self.lock.release()
def notify(self, stop=False, payload=None):
if self.listening:
q = 'notify "%s"' % (stop and self.stop or self.event)
if payload:
q += ", '%s'" % payload
- return self.db.query(q)
+ self.lock.acquire()
+ try:
+ ret = self.db.query(q)
+ finally:
+ self.lock.release()
+ return ret
def __call__(self):
"""Invoke the handler.
@@ -217,7 +232,11 @@
self.callback(None)
break
else:
- notice = self.db.getnotify()
+ self.lock.acquire()
+ try:
+ notice = self.db.getnotify()
+ finally:
+ self.lock.release()
if notice is None:
continue
event, pid, extra = notice
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql