RethinkDB (Python) Change Feed - 如何避免阻塞?
RethinkDB (Python) Change Feed - How to avoid blocking?
RethinkDB 的新手,想确保我做对了。
RethinkDb 中的更改源是否总是阻塞?
文档中给出了以下示例(https://rethinkdb.com/docs/changefeeds/python/)
feed = r.table('users').changes().run(conn)
for change in feed:
print change)
运行在主线程中执行此操作将永远阻塞线程。所以基本上我现在 运行ning 在一个带有睡眠定时器的单独线程中。
这开始感觉很像投票,难道不是不必这样做的全部想法吗?
下面是问题:
有没有我错过的回调版本?
运行在线程中设置更改提要循环的建议是什么?这样做有什么问题吗?
node.js也是这样吗? (记得在 node.js 示例中看到一些回调,但也许那只是异步 .运行 调用)
无法找到任何实际使用的示例,文档只是告诉您打开一个单独的终端 window / python 进程和 运行它在那里。
感谢任何帮助/澄清,谢谢!
Is a change feed in RethinkDb always blocking?
是的,它必须是一个阻塞队列,以便您的代码接受来自更改源的更改流中的每个元素(文档说:与其他游标不同,更改的输出是无限:光标将阻塞,直到有更多元素可用。).
running this in the main thread will block the thread forever.
不完全是:您仍然可以控制您的线程从 changefeed 获取新值,并且您可以做其他事情,而不仅仅是打印一个 change 元素或只是中断 for
语句。
但是,是的,它会被阻止,直到从 RethinkDB 连接读取下一个 changefeed 值。
Is there a callback version of this I've missed?
不,但如果您确实需要,您可以围绕 r.changes()
方法轻松实现面向回调的代码。
Is running the change feed loops in threads what's suggested? Any problems with doing so?
这取决于您的特定应用程序的设计方式。
您可能有一个单线程应用程序,它侦听无限的更改源并执行除打印新更改值之外的其他操作。
如果您的应用程序应该做的不仅仅是监听 changefeed,那么是的,您必须创建一个新线程并在该线程上循环访问 changefeed 流。
Is it the same in node.js? (remember seeing a some callbacks in the node.js examples, but perhaps that was just the async .run call)
是的,这只是因为 node.js 鼓励应用程序完全异步。
一旦你用 cursor.each(console.log);
读取了 changefeed 游标,它将无限地 运行 就像 Python 版本一样(但是,我真的不记得如何打破 each
方法).
Java,与 JavaScript 不同,但与 Python 相似,它还允许使用更改和块对游标中的每个元素进行迭代,直到接受新的更改。
Haven't been able to find any real-world examples of this in use, the docs simply tells you to open a separate terminal window / python process and run it there.
好吧,这是演示其工作原理的最简单的示例:您在某个更改源上收听更改(让它只是一个在终端中运行的简单 CLI 应用程序),然后对更改做任何您想做的事当您从其他地方更改数据库时(它可能是一个内置的 Web 界面,recli
,您的基于 RethinkDB 的应用程序等)。
我可以分享一个简单的现实生活中的例子,这是我以前在 Java (+ Spring Framework) 中第一次使用 RethinkDB 的经验:假设你有一个文档转换 REST只接受某些文档并将其转换为图像的服务,但您还想在浏览器中实时监控转换状态。
它是如何实现的:
- REST服务可以接受多个连接并行处理多个转换请求(当然必须是多线程的)。这些请求转换上传的文档并将其转换状态保存到 RethinkDB 数据库中的特定 table。
- 此外,此 REST 服务在单独的 "forever" 线程中使用
r.changes()
方法侦听 RethinkDB 数据库中 table 的更改,以从 [=54] 读取状态=] 无限并通过网络套接字将状态公开给外部世界,以便您可以在网络浏览器中直接监控它们,而无需任何轮询。您甚至不需要终止此线程,因为它是 "forever" 设计的。
我想到的另一个很好的实时示例是聊天(即时消息)、文档共享(实时查看文件夹更改)、实时多用户文档协作等,以及您可能需要的任何内容考虑实时构建。
RethinkDB 的新手,想确保我做对了。
RethinkDb 中的更改源是否总是阻塞?
文档中给出了以下示例(https://rethinkdb.com/docs/changefeeds/python/)
feed = r.table('users').changes().run(conn)
for change in feed:
print change)
运行在主线程中执行此操作将永远阻塞线程。所以基本上我现在 运行ning 在一个带有睡眠定时器的单独线程中。
这开始感觉很像投票,难道不是不必这样做的全部想法吗?
下面是问题:
有没有我错过的回调版本?
运行在线程中设置更改提要循环的建议是什么?这样做有什么问题吗?
node.js也是这样吗? (记得在 node.js 示例中看到一些回调,但也许那只是异步 .运行 调用)
无法找到任何实际使用的示例,文档只是告诉您打开一个单独的终端 window / python 进程和 运行它在那里。
感谢任何帮助/澄清,谢谢!
Is a change feed in RethinkDb always blocking?
是的,它必须是一个阻塞队列,以便您的代码接受来自更改源的更改流中的每个元素(文档说:与其他游标不同,更改的输出是无限:光标将阻塞,直到有更多元素可用。).
running this in the main thread will block the thread forever.
不完全是:您仍然可以控制您的线程从 changefeed 获取新值,并且您可以做其他事情,而不仅仅是打印一个 change 元素或只是中断 for
语句。
但是,是的,它会被阻止,直到从 RethinkDB 连接读取下一个 changefeed 值。
Is there a callback version of this I've missed?
不,但如果您确实需要,您可以围绕 r.changes()
方法轻松实现面向回调的代码。
Is running the change feed loops in threads what's suggested? Any problems with doing so?
这取决于您的特定应用程序的设计方式。 您可能有一个单线程应用程序,它侦听无限的更改源并执行除打印新更改值之外的其他操作。 如果您的应用程序应该做的不仅仅是监听 changefeed,那么是的,您必须创建一个新线程并在该线程上循环访问 changefeed 流。
Is it the same in node.js? (remember seeing a some callbacks in the node.js examples, but perhaps that was just the async .run call)
是的,这只是因为 node.js 鼓励应用程序完全异步。
一旦你用 cursor.each(console.log);
读取了 changefeed 游标,它将无限地 运行 就像 Python 版本一样(但是,我真的不记得如何打破 each
方法).
Java,与 JavaScript 不同,但与 Python 相似,它还允许使用更改和块对游标中的每个元素进行迭代,直到接受新的更改。
Haven't been able to find any real-world examples of this in use, the docs simply tells you to open a separate terminal window / python process and run it there.
好吧,这是演示其工作原理的最简单的示例:您在某个更改源上收听更改(让它只是一个在终端中运行的简单 CLI 应用程序),然后对更改做任何您想做的事当您从其他地方更改数据库时(它可能是一个内置的 Web 界面,recli
,您的基于 RethinkDB 的应用程序等)。
我可以分享一个简单的现实生活中的例子,这是我以前在 Java (+ Spring Framework) 中第一次使用 RethinkDB 的经验:假设你有一个文档转换 REST只接受某些文档并将其转换为图像的服务,但您还想在浏览器中实时监控转换状态。 它是如何实现的:
- REST服务可以接受多个连接并行处理多个转换请求(当然必须是多线程的)。这些请求转换上传的文档并将其转换状态保存到 RethinkDB 数据库中的特定 table。
- 此外,此 REST 服务在单独的 "forever" 线程中使用
r.changes()
方法侦听 RethinkDB 数据库中 table 的更改,以从 [=54] 读取状态=] 无限并通过网络套接字将状态公开给外部世界,以便您可以在网络浏览器中直接监控它们,而无需任何轮询。您甚至不需要终止此线程,因为它是 "forever" 设计的。
我想到的另一个很好的实时示例是聊天(即时消息)、文档共享(实时查看文件夹更改)、实时多用户文档协作等,以及您可能需要的任何内容考虑实时构建。