Skip to content

Commit c2994a2

Browse files
committed
init
1 parent d4f845e commit c2994a2

File tree

4 files changed

+112
-0
lines changed

4 files changed

+112
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
__pycache__/
33
*.py[cod]
44
*$py.class
5+
test.py
56

67
# C extensions
78
*.so
@@ -99,3 +100,4 @@ ENV/
99100

100101
# mypy
101102
.mypy_cache/
103+
.idea/

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
This `Pool` is very simple, you can use it as usual.
2+
```
3+
def create_conn():
4+
return pymysql.connect(host=mysql_host, port=mysql_port,
5+
user=mysql_user, password=mysql_password,
6+
database=mysql_db, charset='utf8',
7+
autocommit=True)
8+
pool = pymysqlpool.Pool(create_instance=create_conn)
9+
10+
conn = pool.get()
11+
cur = conn.cursor()
12+
cur.execute("select 1")
13+
for x in cur:
14+
pass
15+
cur.close()
16+
conn.close()
17+
```

pymysqlpool.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import threading
2+
import pymysql
3+
4+
5+
def new_close(conn):
6+
if conn.pooling != None:
7+
conn.pooling.put(conn)
8+
elif conn.old_close != None:
9+
conn.old_close()
10+
11+
class Pool(object):
12+
def __init__(self, create_instance, max_count=10, timeout=10):
13+
self.lock = threading.Lock()
14+
self.condition = threading.Condition(self.lock)
15+
self.in_use_list = set()
16+
self.free_list = set()
17+
self.max_count = max_count or 10
18+
self.timeout = timeout or 10
19+
self.new_instance = create_instance
20+
assert (create_instance != None)
21+
self.__change_pymysql_close()
22+
23+
def __change_pymysql_close(self):
24+
old_close = pymysql.connections.Connection.close
25+
if old_close == new_close:
26+
return
27+
pymysql.connections.Connection.close = new_close
28+
pymysql.connections.Connection.old_close = old_close
29+
30+
def get(self):
31+
"""get one from free list"""
32+
with self.lock:
33+
if len(self.free_list) > 0:
34+
one = self.free_list.pop()
35+
self.in_use_list.add(one)
36+
return one
37+
if len(self.in_use_list) < self.max_count:
38+
one = self.new_instance()
39+
one.pooling = self
40+
self.free_list.add(one)
41+
if len(self.free_list) <= 0:
42+
self.condition.wait(self.timeout)
43+
if len(self.free_list) <= 0:
44+
raise TimeoutError()
45+
one = self.free_list.pop()
46+
self.in_use_list.add(one)
47+
return one
48+
49+
def put(self, value):
50+
"""put one into free list"""
51+
with self.lock:
52+
self.in_use_list.remove(value)
53+
self.free_list.add(value)
54+
self.condition.notify_all()
55+
56+
def size(self):
57+
with self.lock:
58+
return len(self.free_list) + len(self.in_use_list)
59+
60+
def max_size(self):
61+
return self.max_count

test.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import pymysql
2+
import pymysqlpool
3+
4+
mysql_host = '192.168.16.102'
5+
mysql_port = 3306
6+
mysql_user = 'root'
7+
mysql_password = '111'
8+
mysql_db = 'db'
9+
10+
def create_conn():
11+
return pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, password=mysql_password, database=mysql_db,
12+
charset='utf8', autocommit=True)
13+
14+
15+
pool = pymysqlpool.Pool(create_instance=create_conn)
16+
17+
conn = pool.get()
18+
cur = conn.cursor()
19+
cur.execute("select 1")
20+
for x in cur:
21+
print(x)
22+
23+
for x in range(20):
24+
conn = pool.get()
25+
print(x)
26+
if x % 2 == 0:
27+
conn.close()
28+
29+
30+
cur.close()
31+
conn.close()
32+
pass

0 commit comments

Comments
 (0)