psycopg2在线程内部阻塞'connect'

时间:2013-07-02 18:57:06

标签: python multithreading blocking psycopg2 python-multithreading

我正在构建一个基于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中使用线程,那么工作正常。

1 个答案:

答案 0 :(得分:0)

所以,事实证明我没有在文档中读到这个问题的原因:Importing in threaded code