我正在 Flask 之上构建一个 Web 框架,其中包括一个用于数据库操作的包装器包,适用于 postgresql 和 MySQL(我不喜欢使用第三方 ORM,这也将帮助我学习一些概念) .
我将详细介绍一个小例子,说明标题中描述的问题发生的位置。我设法用一组非常简洁的模块来模拟这个问题:
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()
一个.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 时,当 c 在线程内创建连接时,从 a 导入 b 时出现块。如果我不在 c 中使用线程,a 可以正常工作。