RethinkDB(Python)更改Feed - 如何避免阻塞?

时间:2018-02-06 21:46:48

标签: rethinkdb rethinkdb-python

RethinkDB新手,想确保我做对了。

RethinkDb中的更改Feed是否始终阻止?

以下示例在文档(https://rethinkdb.com/docs/changefeeds/python/

中给出
feed = r.table('users').changes().run(conn)
for change in feed:
    print change)

在主线程中运行它将永远阻塞线程。所以基本上我现在让它在一个带睡眠定时器的单独线程中运行。

这开始感觉像投票一样,是不是没有必要这样做?

所以问题是:

  • 我是否错过了这个回调版?

  • 在线程中运行更改Feed循环建议的是什么?这样做有什么问题吗?

  • 在node.js中是否相同? (记得在node.js示例中看到一些回调,但也许只是异步.run调用)

Haven已经能够找到任何正在使用的实际示例,文档只是告诉您打开一个单独的终端窗口/ python进程并在那里运行。

感谢任何帮助/澄清,谢谢!

1 个答案:

答案 0 :(得分:1)

  

RethinkDb中的更改Feed是否始终阻止?

是的,它必须是一个阻塞队列才能让你的代码接受来自更改源的更改流中的每个元素(文档说明:与其他游标不同,更改的输出是无限的:游标将阻止,直到有更多元素可用。)。

  

在主线程中运行它将永远阻塞该线程。

不是真的:您仍然可以控制线程从更改源获取新值,除了打印更改元素或者只是中断for语句之外,您还可以执行其他操作。 但是,它是阻塞的,直到从RethinkDB连接读取下一个更改源值。

  

我错过了回调版吗?

不,但如果您真的需要,可以轻松地围绕r.changes()方法实现面向回调的代码。

  

是否正在线程中运行更改Feed循环?这样做有什么问题吗?

这取决于您的特定应用程序的设计方式。 您可能有一个单线程应用程序,它可以侦听无限更改并执行除打印新更改值之外的其他操作。 如果您的应用程序不仅仅需要监听更改源,那么是的,您必须创建一个新线程并遍历该线程上的changefeed流。

  

node.js中是否相同? (记得在node.js示例中看到一些回调,但也许只是异步.run调用)

是的,这只是因为node.js鼓励应用程序完全异步。 一旦你用cursor.each(console.log);读取了更改源光标,它将像Python版本一样无限运行(但是,我真的不记得如何打破each方法)。 Java与JavaScript不同,它也允许使用更改和块来迭代游标中的每个元素,直到接受新的更改。

  

无法找到任何正在使用的实际示例,文档只是告诉您打开一个单独的终端窗口/ python进程并在那里运行。

嗯,这是演示它是如何工作的最简单的示例:您在某个更改源上听取更改(让它只是一个在终端中工作的简单CLI应用程序)并且只要您执行更改时随意执行任何操作从其他地方更改数据库(可能是内置的Web界面,recli,基于RethinkDB的应用程序等)。

我可以分享我之前在Java(+ Spring Framework)中的经验,这是我第一次使用RethinkDB:​​假设您有一个文档转换REST服务,只接受某些文档并将它们转换为图像,但您还希望在浏览器中实时监控转换状态。 如何实施:

  • REST服务可以接受多个连接来并行处理多个转换请求(当然,它必须是多线程的)。这些请求转换上载的文档并将其转换状态保存到RethinkDB数据库中的特定表。
  • 此外,此REST服务在单独的“永久”线程中使用r.changes()方法侦听RethinkDB数据库中的表,以无限方式从表中读取状态,并通过Web套接字将状态公开给外部世界,以便您可以在Web浏览器中直接监控它们,而无需进行任何轮询。你甚至不需要终止这个线程,因为它是“永远”的设计。

我想到的另一个很好的实时示例是聊天(即时消息),文档共享(观看实时文件夹更改),实时多用户文档协作等,以及您可能需要构建的任何内容实时考虑。