什么是您的光标时连接的对象是使用不同的线?会如何发电机的影响这一行为?具体地说...

编辑:原例功能是不正确的;发电机正在返回的一个子的功能, yield 不是直接用于环。这个澄清时 finally 执行(后 return 不会),但仍然没有答案,是否的一个标可以使用,如果另外一个线程开始使用连接的目标是创建。实际上,它似乎(python2.4至少), try...finallyyield 原因的语法错误。

def Get()
  conn = pool.get()
  try:
    cursor = conn.cursor()
    cursor.execute("select * from table ...")
    return IterRows(cursor)
  finally:
    pool.put(conn)

def IterRows(cursor):
  for r in cursor:
    yield r

Get() 是一个功能称为过多线程。连接建立 threaded=False 参数。

我想知道...

  1. 是螺纹1的 cursor 目的仍可使用,如果螺纹2来使用相同的连接的对象?如果不是,什么可能会发生?

行我看到的是一个例外在您谈论的是一个错误协议,然后一个出现段错误,如下所述。

有帮助吗?

解决方案

看看 文档: threadsafety 是我引用

目前,2,这意味着线 可以分享模和连接, 但不光标。

所以你的"游泳池游标"构(其中一个标可通过使用不同的线)似乎会超越 threadsafety 水平。这不是一个问题的共享连接(这是确定的,因为你已经过去了 threaded 正在连接的构造),但光标。你可能需要存储每次光标 threading.local 在第一时间之后一个线程具有使用它,以便使每个线都可以有其自己的1-光标"池"(不是一个关键优化,但:制作一个新的标不是一个重型操作)。

考你的问题2, finally 条款执行时发生的对象(通过建立一个打电话给你发电机的功能 Get)是所有--或者是因为它的提高 StopIteration, 或者因为它是垃圾收集到的(通常是因为最后一个基准,它只是走了).例如,如果叫的是:

def imthecaller():
  for i, row in enumerate(Get()):
    print i, row
    if i > 1: break
  # this is the moment the generators' finally-clause runs
  print 'bye'

finally 执行后(在大多数)3行 yielded。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top