子进程未按预期返回数据

时间:2012-06-15 20:28:44

标签: python exception multiprocessing

我正在使用此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()代码块。相反,我总是收到例外。

我知道查询运行(这是一个简单的选择),它运行不到一秒钟。

我错过了什么吗?

1 个答案:

答案 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')

我担心这可能仅仅是您的示例代码的问题。