[Checkins] SVN: zc.twist/trunk/ add ability to specify an alternate
reactor. change bootstrap to be an external. Prepare for 1.0
release.
Gary Poster
gary at zope.com
Thu Mar 13 11:11:39 EDT 2008
Log message for revision 84636:
add ability to specify an alternate reactor. change bootstrap to be an external. Prepare for 1.0 release.
Changed:
_U zc.twist/trunk/
U zc.twist/trunk/setup.py
U zc.twist/trunk/src/zc/twist/README.txt
U zc.twist/trunk/src/zc/twist/__init__.py
-=-
Property changes on: zc.twist/trunk
___________________________________________________________________
Name: svn:externals
+ bootstrap svn://svn.zope.org/repos/main/zc.buildout/trunk/bootstrap
Modified: zc.twist/trunk/setup.py
===================================================================
--- zc.twist/trunk/setup.py 2008-03-13 14:17:23 UTC (rev 84635)
+++ zc.twist/trunk/setup.py 2008-03-13 15:11:39 UTC (rev 84636)
@@ -4,17 +4,18 @@
setup(
name='zc.twist',
- version='0.1',
+ version='1.0',
packages=find_packages('src'),
package_dir={'':'src'},
- url='http://svn.zope.org/zc.twist',
zip_safe=False,
author='Gary Poster',
description='Mixing Twisted and ZODB',
license='ZPL',
install_requires=[
'ZODB3',
- 'zc.twisted',
+ 'zc.twisted', # setup-friendly Twisted distro. Someday soon we can
+ # discard zc.twisted, hopefully. See
+ # http://twistedmatrix.com/trac/ticket/1286
'zope.component',
'setuptools',
'zope.testing',
Modified: zc.twist/trunk/src/zc/twist/README.txt
===================================================================
--- zc.twist/trunk/src/zc/twist/README.txt 2008-03-13 14:17:23 UTC (rev 84635)
+++ zc.twist/trunk/src/zc/twist/README.txt 2008-03-13 15:11:39 UTC (rev 84636)
@@ -248,6 +248,10 @@
[#teardown_monkeypatch]_. Also, it relies on an undocumented, protected
attribute on the ZODB.DB, so is fragile across ZODB versions.
+You can also specify a reactor for the partial using ``setReactor``, if
+you don't want to use the standard one installed by twisted in
+``twisted.internet.reactor``. [#setReactor]_
+
Gotchas
-------
@@ -430,3 +434,59 @@
.. [#teardown_monkeypatch]
>>> twisted.internet.reactor.callLater = oldCallLater
+
+.. [#setReactor]
+
+ >>> db.setPoolSize(1)
+ >>> db.getPoolSize()
+ 1
+ >>> demo.count = 0
+ >>> transaction.commit()
+ >>> call = Partial(demo).setReactor(faux)
+ >>> res = None
+ >>> deferred = call()
+ >>> d = deferred.addCallback(get_result)
+ >>> call.attempt_count
+ 0
+ >>> time_flies(.1) >= 1 # returns number of connection attempts
+ True
+ >>> call.attempt_count
+ 0
+ >>> res # None
+ >>> db.setPoolSize(2)
+ >>> db.getPoolSize()
+ 2
+ >>> time_flies(.2) >= 1
+ True
+ >>> call.attempt_count > 0
+ True
+ >>> res
+ 1
+ >>> t = transaction.begin()
+ >>> demo.count
+ 1
+
+If it takes more than a second or two, it will eventually just decide to grab
+one. This behavior may change.
+
+ >>> db.setPoolSize(1)
+ >>> db.getPoolSize()
+ 1
+ >>> call = Partial(demo).setReactor(faux)
+ >>> res = None
+ >>> deferred = call()
+ >>> d = deferred.addCallback(get_result)
+ >>> call.attempt_count
+ 0
+ >>> time_flies(.1) >= 1
+ True
+ >>> call.attempt_count
+ 0
+ >>> res # None
+ >>> time_flies(1.9) >= 2 # for a total of at least 3
+ True
+ >>> res
+ 2
+ >>> t = transaction.begin()
+ >>> demo.count
+ 2
Modified: zc.twist/trunk/src/zc/twist/__init__.py
===================================================================
--- zc.twist/trunk/src/zc/twist/__init__.py 2008-03-13 14:17:23 UTC (rev 84635)
+++ zc.twist/trunk/src/zc/twist/__init__.py 2008-03-13 15:11:39 UTC (rev 84636)
@@ -78,7 +78,7 @@
missing = object()
-def get_connection(db, deferred=None, backoff=None):
+def get_connection(db, deferred=None, backoff=None, reactor=None):
if deferred is None:
deferred = twisted.internet.defer.Deferred()
if backoff is None:
@@ -91,8 +91,10 @@
# long and we don't have a connection within our limit, try again
# later.
if backoff < .5 and not availableConnectionCount(db):
- twisted.internet.reactor.callLater(
- backoff, get_connection, db, deferred, backoff)
+ if reactor is None:
+ reactor = twisted.internet.reactor
+ reactor.callLater(
+ backoff, get_connection, db, deferred, backoff, reactor)
return deferred
deferred.callback(db.open(
transaction_manager=transaction.TransactionManager()))
@@ -108,6 +110,7 @@
class Partial(object):
attempt_count = 0
+ _reactor = None
def __init__(self, call, *args, **kwargs):
self.call = Reference(call)
@@ -126,14 +129,24 @@
else:
continue
break
- else:
+ else: # no persistent bits
call, args, kwargs = self._resolve(None)
return call(*args, **kwargs)
self.attempt_count = 0
d = twisted.internet.defer.Deferred()
- get_connection(db).addCallback(self._call, d)
+ get_connection(db, reactor=self.getReactor()).addCallback(
+ self._call, d)
return d
+ def setReactor(self, value):
+ self._reactor = value
+ return self
+
+ def getReactor(self):
+ if self._reactor is None:
+ return twisted.internet.reactor
+ return self._reactor
+
def _resolve(self, conn):
if IDeferredReference.providedBy(self.call):
call = self.call(conn)
@@ -167,7 +180,8 @@
res = sanitize(twisted.python.failure.Failure())
d.errback(res)
else:
- get_connection(db).addCallback(self._call, d)
+ get_connection(db, reactor=self.getReactor()).addCallback(
+ self._call, d)
except EXPLOSIVE_ERRORS:
tm.abort()
conn.close()
More information about the Checkins
mailing list