この質問から受け入れられた回答を使用しています。関連するコードは以下です。
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()
結果をポーリングするときは、コードのブロックに入ることはありません。代わりに、常に例外を受け取ります。
クエリが実行されることはわかっています (これは単純な選択です)。1 秒もかからずに実行されます。
私は何か見落としてますか?