我正在尝试使用Python,Redis和PostgreSQL放置需要访问数据库的作业。我正在做以下事情:
使用RQ将作业放入Redis队列:
def queue_data(self, json_data):
Queue().enqueue(process_data, json.dumps(json_data))
在process_data
中,使用psycopg2对PostgreSQL数据库执行查询:
def process_data(json_data):
with psycopg2.connect("dbname=pgtest2db user=pgtest2user") as conn:
with conn.cursor() as cursor:
# I'm not actually doing this query, but you get the idea
cursor.execute("SELECT * FROM some_table")
conn.close()
显然,这远非最佳,因为每次调用process_data
都会创建一个新连接。实现这一目标的最佳做法是什么?谁应该负责管理数据库连接池?
请注意,我强迫自己不要使用ORM,因为我这样做是为了教自己,我想从更纯粹的角度理解这些模式。
我最终使用了像这样的自定义工作者:
import os
import node
import redis
from rq import Worker, Queue, Connection
from psycopg2.pool import ThreadedConnectionPool
listen = ['high', 'default', 'low']
redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
redis_conn = redis.from_url(redis_url)
pool = ThreadedConnectionPool(minconn = 1, maxconn = 10, dsn = "dbname=pgtest2db user=pgtest2user")
def process_data(json_data):
dbconn = pool.getconn()
result = perform_some_db_actions(dbconn, json_data)
pool.putconn(dbconn)
return result
if __name__ == '__main__':
with Connection(redis_conn):
print "Setting up Redis"
worker = Worker(map(Queue, listen))
worker.work()
答案 0 :(得分:0)
我知道为时已晚,但是每个想知道如何在RQ中使用psycopg2的人(尤其是当您遇到SSL错误时:解密失败或记录不正确的mac-只需在内部打开连接 worker(即任务。最好创建单例而不是每次都打开连接)。而不是在worker.work()函数之前。