Skip to content

Commit f63cd10

Browse files
committed
up version
1 parent 4ed30b3 commit f63cd10

File tree

9 files changed

+140
-31
lines changed

9 files changed

+140
-31
lines changed

.flake8

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[flake8]
2+
ignore = E203, E266, E501, W503, F403, F401
3+
max-line-length = 88
4+
max-complexity = 18
5+
select = B,C,E,F,W,T4,B9

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,5 @@ docs/_build/
5656
# PyBuilder
5757
target/
5858

59-
.idea/
59+
.idea/
60+
.env/

.pre-commit-config.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
repos:
2+
- repo: https://github.com/pre-commit/pre-commit-hooks
3+
rev: v2.5.0
4+
hooks:
5+
- id: trailing-whitespace
6+
- id: end-of-file-fixer
7+
- id: check-docstring-first
8+
- id: check-added-large-files
9+
args: ['--maxkb=4096']
10+
- id: check-yaml
11+
- id: debug-statements
12+
- id: name-tests-test
13+
- repo: https://github.com/asottile/reorder_python_imports
14+
rev: v1.9.0
15+
hooks:
16+
- id: reorder-python-imports
17+
language_version: python3
18+
- repo: https://github.com/psf/black
19+
rev: stable
20+
hooks:
21+
- id: black
22+
language_version: python3
23+
- repo: https://gitlab.com/pycqa/flake8
24+
rev: 3.8.2
25+
hooks:
26+
- id: flake8

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,3 @@ deploy:
1414
secure: TNTQ/ZdP7ygaJTKdNop+KOqGXRghchl/8UUH5tM5P+fnFxrGBitVvWYlurhhHphjRWFXify0k4uCU3D14OIRTyPAKtC5wBqWCwV+hWx2C0T332ou8lowczvN/uEWLNnoJKiiS2127QBLUHEoFR2/LKdchCvVY7n4gnYzjkCnXin45/CdOV88065xAriO4/UG11Q2ohMTmP5Vm6z51102aPySTqwPQJB5ywg3Q7uUs2CZjQIa7IUV7ZXe/lGe0bs5jF24A1i6Vrdt5PykRuTdIsjsvvcnD4ghHpB5XOlev5OFWaXyCqAvjfZySjYaD6Tv1EJbGDZb/sTxps/7CRixCkJX7CDY6a2krMRxdq38zGnFjRN5/R9Fb5fbjQnrGgJusi0oLbNuzm1tSb37rdddYqK79iWBEUSt+nnu5LZL3FlPz6cxld8kBQId7juZ+aFY/Y6bThSB7WIVgouY8gW7t9NKDGisGrc0xYk38dH6EblYKbOQ/J4eYMqmrmgcGm71S2b4q5jOA+PJF/7NLUP7wmYyqi/6WficFsV4DDzd1wPHs7yBMwPXpNvgpPJ74iNiFIdI+HzL6LblMmTBm0EB+8Q6iYwK3GVJulrQwW5H5xaIABJNnOgMU5fQcGT5N76jbP2xHu79ZgBFzhE4fiNAlnSKnCN+qfX4TmEz09A8P1g=
1515
on:
1616
tags: true
17-

README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ sample:
2828
# with connection
2929
from pika import URLParameters
3030
from pooled_pika import PooledConn
31-
31+
3232
AMQP_PARAM = URLParameters('amqp://user:pwd@amqpserver')
3333
pooled_conn = PooledConn(AMQP_PARAM)
3434
d = pooled_conn.acquire()
@@ -43,7 +43,7 @@ or:
4343
# with channel
4444
from pika import URLParameters
4545
from pooled_pika import PooledConn
46-
46+
4747
AMQP_PARAM = URLParameters('amqp://user:pwd@amqpserver')
4848
pooled_conn = PooledConn(AMQP_PARAM)
4949
d = pooled_conn.acquire(channel=True)

pooled_pika.py

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
# coding=utf-8
22
import logging
33
import threading
4-
54
from contextlib import contextmanager
6-
from pika.adapters import TwistedProtocolConnection
5+
76
from pika.adapters.twisted_connection import TwistedChannel
7+
from pika.adapters.twisted_connection import TwistedProtocolConnection
88
from pika.connection import Parameters
9-
from twisted.internet import reactor, defer
9+
from twisted.internet import defer
10+
from twisted.internet import reactor
1011
from twisted.internet.protocol import ClientCreator
1112

13+
try:
14+
itervalues = dict.itervalues
15+
except AttributeError:
16+
itervalues = dict.values
17+
1218
__all__ = ["VERSION", "PooledConn"]
1319

14-
VERSION = "0.1.6"
20+
21+
VERSION = "0.2.0"
1522

1623
logger = logging.getLogger(__name__)
1724

@@ -47,7 +54,7 @@ class PooledConn(object):
4754

4855
loop = reactor
4956

50-
def __new__(cls, params, timeout_conn=None, max_size=None):
57+
def __new__(cls, params, timeout_conn=0, max_size=None):
5158
"""
5259
:param cls:
5360
:param params: connection params
@@ -67,18 +74,22 @@ def __new__(cls, params, timeout_conn=None, max_size=None):
6774
cls._my_pools[1][_id] = {}
6875
cls._my_channels[_id] = {}
6976
cls._max_size[_id] = max_size if max_size else cls.max_size
70-
cls._timeout[_id] = timeout_conn if timeout_conn > 0 else cls.timeout_conn
77+
cls._timeout[_id] = (
78+
timeout_conn if timeout_conn > 0 else cls.timeout_conn
79+
)
7180
cls._waiting[_id] = []
7281
# only works when first created
7382
instance.__params = cls._my_params[_id]
7483
instance.__max_size = cls._max_size[_id]
7584
instance.timeout_conn = cls._timeout[_id]
76-
instance.__idle_pool, instance.__using_pool = (cls._my_pools[i][_id] for i in (0, 1))
85+
instance.__idle_pool, instance.__using_pool = (
86+
cls._my_pools[i][_id] for i in (0, 1)
87+
)
7788
instance.__channel_pool = cls._my_channels[_id]
7889
instance.waiting = cls._waiting[_id]
7990
return instance
8091
else:
81-
raise TypeError('only accept pika Parameters type')
92+
raise TypeError("only accept pika Parameters type")
8293

8394
def __init__(self, *args, **kwargs):
8495
"""
@@ -97,25 +108,40 @@ def __connect(self, retrying=False):
97108
params = self.__params
98109
cc = ClientCreator(self.loop, TwistedProtocolConnection, params)
99110
_d = cc.connectTCP(params.host, params.port, timeout=self.timeout_conn)
100-
_d.addCallback(lambda p: p.ready)
101-
_d.addCallbacks(self._in_pool,
102-
lambda err: err if retrying or not self.retry else self.__connect(True)) # retry once when err
111+
112+
def conn_ready(c):
113+
c.ready.addCallback(lambda _: c)
114+
return c.ready
115+
116+
_d.addCallback(conn_ready)
117+
_d.addCallbacks(
118+
self._in_pool,
119+
lambda err: err if retrying or not self.retry else self.__connect(True),
120+
) # retry once when err
103121
return _d
104122

105123
def _in_pool(self, conn):
106-
assert isinstance(conn, TwistedProtocolConnection), 'conn must be TwistedProtocolConnection'
107-
logger.debug('in pool : %s' % conn)
124+
assert isinstance(
125+
conn, TwistedProtocolConnection
126+
), "conn must be TwistedProtocolConnection"
127+
logger.debug("in pool : %s" % conn)
108128

109129
_id = id(conn)
110130

111131
if self.size < self.__max_size:
112132
# add hook to clear the bad connection object in the pool
113133
conn.ready = defer.Deferred()
114-
conn.ready.addErrback(self._clear, self.__idle_pool, self.__using_pool, self.__channel_pool, _id)
134+
conn.ready.addErrback(
135+
self._clear,
136+
self.__idle_pool,
137+
self.__using_pool,
138+
self.__channel_pool,
139+
_id,
140+
)
115141
# add new conn in using pool
116142
self.__using_pool[_id] = conn
117143
else:
118-
raise RuntimeError('_in_pool, unexpected reach')
144+
raise RuntimeError("_in_pool, unexpected reach")
119145

120146
return conn
121147

@@ -133,10 +159,10 @@ def _clear(reason, idle_pool, using_pool, channel_pool, conn_id):
133159
with _lock():
134160
try:
135161
idle_pool.pop(conn_id)
136-
logger.info('a connection lost when not using')
162+
logger.info("a connection lost when not using")
137163
except KeyError:
138164
if using_pool.pop(conn_id, None):
139-
logger.warn('connection lost when using, should be handled later')
165+
logger.warn("connection lost when using, should be handled later")
140166
return reason
141167
finally:
142168
channel_pool.pop(conn_id, None)
@@ -152,7 +178,9 @@ def _get_channel(self, conn):
152178
d.callback(p[_id])
153179
if d is None:
154180
d = conn.channel()
155-
d.addCallback(lambda ch: p.update({_id: ch}) or setattr(ch, 'pool_id_', _id) or ch)
181+
d.addCallback(
182+
lambda ch: p.update({_id: ch}) or setattr(ch, "pool_id_", _id) or ch
183+
)
156184

157185
def _h_err(ch, _conn):
158186
_conn.ready.addErrback(lambda _, _c: p.pop(id(_c), None), _conn)
@@ -203,5 +231,5 @@ def size(self):
203231

204232
def clear(self):
205233
with _lock():
206-
for c in self.__idle_pool.itervalues():
234+
for c in itervalues(self.__idle_pool):
207235
c.close()

setup.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from setuptools import setup, find_packages
1+
from setuptools import find_packages
2+
from setuptools import setup
23

34

45
setup(
56
name="pooled-pika",
6-
version="0.1.6",
7+
version="0.2.0",
78
py_modules=["pooled_pika"],
8-
install_requires=["twisted>=13.2.0", "pika>=0.10.0"],
9+
install_requires=["twisted~=20.3.0", "pika~=1.1.0"],
910
description="a connection pool wrapper about async pika",
1011
long_description="""
1112
Notice
@@ -21,7 +22,7 @@
2122
# with connection
2223
from pika import URLParameters
2324
from pooled_pika import PooledConn
24-
25+
2526
AMQP_PARAM = URLParameters('amqp://user:pwd@amqpserver')
2627
pooled_conn = PooledConn(AMQP_PARAM)
2728
d = pooled_conn.acquire()
@@ -36,7 +37,7 @@
3637
# with channel
3738
from pika import URLParameters
3839
from pooled_pika import PooledConn
39-
40+
4041
AMQP_PARAM = URLParameters('amqp://user:pwd@amqpserver')
4142
pooled_conn = PooledConn(AMQP_PARAM)
4243
d = pooled_conn.acquire(channel=True)
@@ -48,6 +49,5 @@
4849
author_email="zephor@qq.com",
4950
url="https://github.com/Zephor5/pooled-pika",
5051
license="BSD 3-clause",
51-
packages=find_packages()
52+
packages=find_packages(),
5253
)
53-

test.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# coding=utf-8
2+
import logging
3+
4+
from pika import URLParameters
5+
from twisted.internet import defer
6+
from twisted.internet import reactor
7+
from twisted.trial.unittest import TestCase
8+
9+
from pooled_pika import PooledConn
10+
11+
__author__ = "zephor"
12+
13+
try:
14+
range = xrange
15+
except NameError:
16+
pass
17+
18+
AMQP_PARAM = URLParameters("amqp://guest:guest@127.0.0.1:5672/spider")
19+
20+
21+
def sleep(_, seconds):
22+
d = defer.Deferred()
23+
reactor.callLater(seconds, d.callback, seconds)
24+
return d
25+
26+
27+
class ConnTest(TestCase):
28+
@classmethod
29+
def setUpClass(cls):
30+
cls.pooled_conn = PooledConn(AMQP_PARAM,)
31+
32+
def test_get_conn(self):
33+
self.n = 0
34+
test_d = []
35+
36+
def plus(_c):
37+
self.n += 1
38+
return _c
39+
40+
for i in range(100):
41+
d = self.pooled_conn.acquire(channel=True)
42+
d.addCallback(plus)
43+
d.addCallback(self.pooled_conn.release)
44+
d.addErrback(lambda err: logging.error(err))
45+
test_d.append(d)
46+
res_d = defer.DeferredList(test_d)
47+
res_d.addCallback(lambda _: self.assertEqual(self.n, 100))
48+
res_d.addCallback(lambda _: self.pooled_conn.clear())
49+
res_d.addCallback(sleep, 1)
50+
return res_d

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# and then run "tox" from this directory.
55

66
[tox]
7-
envlist = py27
7+
envlist = py27,py36,py37,py38
88

99
[testenv]
1010
commands = nosetests

0 commit comments

Comments
 (0)