pymongo 中的 Tailable 游标似乎已停止工作
Tailable cursor in pymongo seems to have stopped working
我已经成功地在 Pymongo 中使用可尾游标 2 年了,没有任何障碍,但是突然之间,今天,我的相同代码抛出了一个 "unexpected keyword" 错误:
几周前我升级到 3.0 Mongo,它仍然工作正常,但也许新的 pymongo 版本现在与我今天刚安装的新版本 (3.0.1) 不同?以前是pymongo 2.6.3。我的代码:
cursor = refreq.find(tailable = True, await_data = True)
while cursor.alive:
xxx
所以基本上只要有东西被插入到 refreq 集合中,我就想知道它,而无需轮询。过去工作正常。最近安装了 Pymongo 3.0.1 版(今天)。
也尝试输入一个空字典
cursor = refreq.find({}, tailable = True, await_data = True)
但仍然给出相同的错误。有什么变化吗?
这里是完整的线程代码,供参考:
def handleRefRequests(db, refqueue):
""" handles reference data requests. It's threaded. Needs the database id.
will create a capped collection and constantly poll it for new requests"""
print("Dropping the reference requests collection")
db.drop_collection("bbrefrequests")
print("Recreating the reference requests collection")
db.create_collection("bbrefrequests", capped = True, size = 100 * 1000000) # x * megabytes
refreq = db.bbrefrequests
# insert a dummy record otherwise exits immediately
refreq.insert({"tickers":"test", "fields":"test", "overfields":"test", "overvalues":"test", "done": False})
cursor = refreq.find({}, tailable = True, await_data = True)
while cursor.alive:
try:
post = cursor.next()
if ("tickers" in post) and ("fields" in post) and ("done" in post): # making sure request is well formed
if post["tickers"] != "test":
refqueue.put(post)
except StopIteration:
time.sleep(0.1)
if not runThreads:
print("Exiting handleRefRequests thread")
break
在 pymongo 3.0 中,find
为此采用了 cursor_type
选项。 tailable
和 await_data
参数已被删除。
所以应该是:
cursor = refreq.find(cursor_type = CursorType.TAILABLE_AWAIT)
我已经成功地在 Pymongo 中使用可尾游标 2 年了,没有任何障碍,但是突然之间,今天,我的相同代码抛出了一个 "unexpected keyword" 错误:
几周前我升级到 3.0 Mongo,它仍然工作正常,但也许新的 pymongo 版本现在与我今天刚安装的新版本 (3.0.1) 不同?以前是pymongo 2.6.3。我的代码:
cursor = refreq.find(tailable = True, await_data = True)
while cursor.alive:
xxx
所以基本上只要有东西被插入到 refreq 集合中,我就想知道它,而无需轮询。过去工作正常。最近安装了 Pymongo 3.0.1 版(今天)。
也尝试输入一个空字典
cursor = refreq.find({}, tailable = True, await_data = True)
但仍然给出相同的错误。有什么变化吗?
这里是完整的线程代码,供参考:
def handleRefRequests(db, refqueue):
""" handles reference data requests. It's threaded. Needs the database id.
will create a capped collection and constantly poll it for new requests"""
print("Dropping the reference requests collection")
db.drop_collection("bbrefrequests")
print("Recreating the reference requests collection")
db.create_collection("bbrefrequests", capped = True, size = 100 * 1000000) # x * megabytes
refreq = db.bbrefrequests
# insert a dummy record otherwise exits immediately
refreq.insert({"tickers":"test", "fields":"test", "overfields":"test", "overvalues":"test", "done": False})
cursor = refreq.find({}, tailable = True, await_data = True)
while cursor.alive:
try:
post = cursor.next()
if ("tickers" in post) and ("fields" in post) and ("done" in post): # making sure request is well formed
if post["tickers"] != "test":
refqueue.put(post)
except StopIteration:
time.sleep(0.1)
if not runThreads:
print("Exiting handleRefRequests thread")
break
在 pymongo 3.0 中,find
为此采用了 cursor_type
选项。 tailable
和 await_data
参数已被删除。
所以应该是:
cursor = refreq.find(cursor_type = CursorType.TAILABLE_AWAIT)