我们经常使用数据库连接池,但那是有时候有些库并没有实现线程安全的连接池,这个时候,该如何自己封装?多进程和多线程甚至协程模式下,如何控制数据库连接数量或者是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 _