我正在构建一个基于Flask的Web框架,其中包含一个用于数据库操作的包装程序包,它将适用于postgresql和MySQL(我不喜欢使用第三方ORM,这也有助于我学习几个概念)。
我将详细介绍标题中描述的问题出现的一个小例子。我设法通过一组非常简洁的模块来模拟问题:
c.py
#coding=utf-8
import threading
import psycopg2
class Pool(object):
def __init__(self):
t = threading.Thread(target=self.push)
t.daemon = True
t.start()
t.join()
def push(self):
print 'creating connection'
self.conn = psycopg2.connect(database='geocercas', user='geo', password='geow', host='localhost')
print 'created connection'
def get(self):
return self.conn
b.py
#coding=utf-8
from c import Pool
pool = Pool()
a.py
#coding=utf-8
from b import pool
如果我运行b.py,我会得到结果:
creating connection
created connection
Process finished with exit code 0
如果我运行a.py,我会:
creating connection
它只是挂在那里。
我在Debian 7上运行Python 2.7.3 编辑:为了清楚,从b导入c时发生阻塞,然后b从c中创建线程内的连接时发生。如果我不在c中使用线程,那么工作正常。