python 單例模式實現多執行緒共享連線池

2021-09-29 18:05:15 字數 2059 閱讀 8532

我們經常使用資料庫連線池,但那是有時候有些庫並沒有實現執行緒安全的連線池,這個時候,該如何自己封裝?多程序和多執行緒甚至協程模式下,如何控制資料庫連線數量或者是socket連線數。這個問題很有意義。

首先,多程序,通常的做法是每個程序例項化乙個連線池,為什麼不共享乙個池,因為多程序和多執行緒同步的開銷不一樣,一般三方庫都不會支援,但是redis 的庫可以,他有些細節不一樣。然後多執行緒共享,只需要將連線放到乙個執行緒安全的容器,比如list 或者queue中。注意多執行緒和多程序的queue實現方式完全不一樣,多執行緒是使用的mmap。

下面看看乙個demo:

import multiprocessing

import threading

import os

def singleton(cls, *args, **kw):

instances = {}#

print "instance is",id(instances)

def _singleton():

#key = str(cls) + str(os.getpid())

key = str(cls)

if key not in instances:

instances[key] = cls(*args, **kw)

return instances[key]

return _singleton

print "instance has been free"

@singleton

class db(object):

def __init__(self):

self.rabbitmq_pool = self.init_rabbitmq_pool()

def init_rabbitmq_pool(self):

pool = 1#為了簡化

return pool

#db = singleton(db)

def process1():

print "proc 1 "

db1 = db()

print "db1 is ", id(db1)

def process2():

print "proc 2 "

db2 = db()

print "db2 is", id(db2)

if __name__=="__main__":

# print "multiproce "

# pro1 = multiprocessing.process(target=process1)

# pro2 = multiprocessing.process(target=process2)

# pro1.start()

# pro2.start()

# pro1.join()

# pro2.join()

print "print thread"

pro1 = threading.thread(target=process1)

pro2 = threading.thread(target=process2)

pro1.start()

pro2.start()

pro1.join()

pro2.join()

這部分**是簡化了自己封裝的連線池的**, 主要觀察執行緒單例是否生效,然後那個instance為什麼執行緒能夠共享乙個連線池。

下面是列印結果:

instance is 140442806348048

print thread

proc 1

db1 is 140442806366352proc 2

db2 is 140442806366352

看到結果,其實很多問題就知道答案了,使用裝飾器後, 整個**段載入的時候,裝飾器就已經開始執行,這裡的instances 是不會釋放的,實際上**初始化的時候就執行了db = singleton(db) ,相當於是 這個閉包是全域性變數,又因為dict本身執行緒安全。所以每次執行緒用這閉包的時候,獲取連線物件都是執行緒安全的。

這裡的單例對多程序是不會生效的。   

c 多執行緒單例模式 C 單例模式實現

單例模式,可以說設計模式中最常應用的一種模式了。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全域性或者靜態變數的方式,這樣比較簡單,也是沒學過設計模式的人所能想到的最簡單的方式了。一般情況下,我們建立的一些類是屬於工具性質的,基本不用儲存太多...

多執行緒 單例模式的實現

單例模式 餓漢式 public class myobject public static myobject getinstance 懶漢式 public class myobject public static myobject getinstance return obj 懶漢式的 如果寫成上面這...

多執行緒 單例模式

單例模式 是非常典型常用的一種設計模式 乙份資源只能被申 載一次 單例模式的方法建立的類在當前程序中只有乙個例項 資源的程式初始化的時候就去載入,後面使用的時候直接使用,使用的時候比較流暢,有可能會載入用不上的資源,導致程式初始化時間比較慢。include class single instance...