實用:python線程中信號量在連接池的使用

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章