2012-06-21 39 views
1

我有一个程序保持与postgresql服务器的持久连接。假设由于网络问题导致连接被阻塞(可以通过关闭网络接口来模拟),使用eventlet调用查询的过程被阻塞。这阻止了其他事件也执行。附加gdb表明进程在psycopg2 C代码中被阻塞。我试过postgresql TCP keepalives。但是,如果在连接丢失后立即调用查询,这也会失败。Psycopg2 - Eventlet连接挂起

有什么办法可以防止eventlet进入这个状态吗?有什么办法可以将eventlet从这个状态中解脱出来。

GDB

#0 0x00002b4e7836be46 in poll() from /lib64/libc.so.6 
#1 0x00002b4e835dec4f in ??() from /usr/pgsql-9.0/lib/libpq.so.5 
#2 0x00002b4e835ded50 in ??() from /usr/pgsql-9.0/lib/libpq.so.5 
#3 0x00002b4e835dd28e in PQgetResult() from /usr/pgsql-9.0/lib/libpq.so.5 
#4 0x00002b4e833a4284 in psyco_exec_green (conn=0x21f42510, command=<value optimized out>) at psycopg/green.c:195 
#5 0x00002b4e833a5387 in pq_execute_command_locked (conn=0x21f42510, 
    query=0x2b4e833b5de8 "BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED", pgres=0x7fff84c38448, error=0x7fff84c38440, 
    tstate=0x7fff84c38438) at psycopg/pqpath.c:342 
#6 0x00002b4e833a58f7 in pq_begin_locked (conn=0x21f42510, pgres=0xffffffffffffffff, error=0xffffffffffffffff, tstate=0x0) 
    at psycopg/pqpath.c:424 
#7 0x00002b4e833a59a0 in pq_execute (curs=0x1f487528, query=0x2248c894 "SELECT 1", async=0) at psycopg/pqpath.c:764 
#8 0x00002b4e833ab15b in _psyco_curs_execute (self=0x1f487528, operation=0x0, vars=0x21ec9a80, async=0) 
    at psycopg/cursor_type.c:419 
#9 0x00002b4e833ab7b1 in psyco_curs_execute (self=0x1f487528, args=<value optimized out>, kwargs=<value optimized out>) 
    at psycopg/cursor_type.c:475 

回答