我正在使用此question中接受的答案。相关代码如下。
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()
代码块。相反,我总是收到例外。
我知道查询运行(这是一个简单的选择),它运行不到一秒钟。
我错过了什么吗?
答案 0 :(得分:1)
嗯,基于您发布的代码的一些事情。首先,你永远不会start()
这个过程。但也许这只是你在输入这个例子时犯的错误?
其次,你不会通过连接send()
做任何事情。
以上是具有预期行为的上述简化版本:
import multiprocessing
import time
def simple_example(wait, timeout, query):
conn1, conn2 = multiprocessing.Pipe(False)
subproc = multiprocessing.Process(target=do_query, args=(wait, query, conn2))
subproc.start()
subproc.join(timeout)
if conn1.poll():
return conn1.recv()
subproc.terminate()
raise Exception('Query %r ran for >%r' % (query, timeout))
def do_query(wait, query, conn):
print query
time.sleep(wait)
conn.send(query)
res = simple_example(0, 2, 'foo')
res = simple_example(3, 2, 'foo')
我担心这可能仅仅是您的示例代码的问题。