import threading
import logging
logging.basicConfig(level=logging.INFO,format='%(thread)d %(threadName)s %(message)s')
import time
class Conn:
def __init__(self,name):
self.name = name
class Pool:
def __init__(self,count=3):
self.count = count
self.sema = threading.Semaphore(count)
self.pool = [Conn('conn-{}'.format(i)) for i in range(count)]
def get_conn(self):
self.sema.acquire()
data = self.pool.pop()
return data
def return_conn(self,conn:Conn):
self.pool.append(conn)
self.sema.release()
pool = Pool(3)
print(pool.get_conn().name)
print(pool.get_conn().name)
print(pool.get_conn().name)
print('===================')
pool.return_conn(Conn('conn-3'))
print(pool.get_conn().name)
運行結果:
conn-2
conn-1
conn-0
===================
conn-3
改進:
import threading
import logging
logging.basicConfig(level=logging.INFO,format='%(thread)d %(threadName)s %(message)s')
import random
class Conn:
def __init__(self,name):
self.name = name
class Pool:
def __init__(self,count=3):
self.count = count
self.sema = threading.Semaphore(count)
self.pool = [self._conn('conn-{}'.format(i)) for i in range(self.count)]
def _conn(self,conn_name):
return Conn(conn_name)
def get_conn(self):
self.sema.acquire()
return self.pool.pop()
def return_conn(self,conn:Conn):
self.pool.append(conn)
self.sema.release()
pool = Pool(3)
def worker(pool:Pool):
conn = pool.get_conn()
logging.info(conn.name)
#模擬使用了一段時間
threading.Event().wait(random.randint(1,4))
pool.return_conn(conn)
for i in range(6):
threading.Thread(target=worker,name='worker-{}'.format(i),args=(pool,)).start()
運行結果:
140691123734272 worker-0 conn-2
140691115341568 worker-1 conn-1
140691106948864 worker-2 conn-0
140691098556160 worker-3 conn-1
140691090163456 worker-4 conn-2
140691081770752 worker-5 conn-0