我正在使用这个问题的公认答案。相关代码如下。
import multiprocessing
def query_with_timeout(dbc, timeout, query, *a, **k):
conn1, conn2 = multiprocessing.Pipe(False)
subproc = multiprocessing.Process(target=do_query,
args=(dbc, query, conn2)+a,
kwargs=k)
subproc.join(timeout)
if conn1.poll():
return conn1.recv()
subproc.terminate()
raise Exception("Query %r ran for >%r" % (query, timeout))
def do_query(dbc, query, conn, *a, **k):
cu = dbc.cursor()
cu.execute(query, *a, **k)
return cu.fetchall()
我的电话看起来像这样:
res = query_with_timeout(dbconn, 30, "SELECT * FROM `table`)
print res
dbconn
是一个连接对象。它在应用程序的其他地方(在此超时功能之外)使用没有任何问题。
它似乎加入了子进程并等待了 30 秒。尽管它在轮询结果时从不进入if conn1.poll():
return conn1.recv()
代码块。相反,我总是收到异常。
我知道查询运行(这是一个简单的选择),它运行不到一秒钟。
我错过了什么?