您、发电机和螺纹蟒蛇
-
22-09-2019 - |
题
什么是您的光标时连接的对象是使用不同的线?会如何发电机的影响这一行为?具体地说...
编辑:原例功能是不正确的;发电机正在返回的一个子的功能, yield
不是直接用于环。这个澄清时 finally
执行(后 return
不会),但仍然没有答案,是否的一个标可以使用,如果另外一个线程开始使用连接的目标是创建。实际上,它似乎(python2.4至少), try...finally
与 yield
原因的语法错误。
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的
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行 yield
ed。
不隶属于 StackOverflow