RethinkDB(Python)更改供稿 - 如何避免阻塞



RETHINKDB的新事物,并希望确保我做对了。

rethinkdb中的变化feed总是阻止吗?

在文档(https://rethinkdb.com/docs/changefeeds/python/(

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

在主线程中运行它将永远阻止线程。因此,基本上我现在将其运行在带有睡眠计时器的单独线程中。

这开始感觉很像投票,不是不必这样做的整个想法吗?

所以这是:

  • 是否有我错过的回调版?

  • 在线程中运行更改供稿回路是什么建议?这样做的问题吗?

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

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

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

rethinkdb中的变化feed总是阻止吗?

是的,它必须是一个阻止队列,以便让您的代码接受该更改式的更改流中的每个元素(文档说:与其他光标不同,更改的输出是无限的:光标将阻止直到有更多元素可用。(。

在主线程中运行此内容将永远阻止线程。

不是真的:您仍然可以控制线程一个从ChangeFeed获得的新值,您可以做其他事情,而不仅仅是打印更改元素或仅破坏for语句。但是,是的,它已被阻止,直到从rethinkdb连接读取下一个变更馈值。

我错过了这个回调版吗?

否,但是如果您确实需要它,则可以在r.changes()方法周围轻松实现面向回调的代码。

在线程中运行更改供稿回路的建议是什么?这样做的问题吗?

这取决于您的特定应用程序的设计。您可能会有一个单线程应用程序,该应用程序会倾听无限的更改速度,而不仅仅是打印新的更改值。如果您的应用程序不仅要做更大的操作,还要聆听更改feed,是的,您必须创建一个新线程,并通过该线程上的ChangeFeed流进行迭代。

在node.js中是相同的吗?(请记住在node.js示例中看到一些回调,但这也许只是异步呼叫(

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

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

好吧,这是演示其工作原理的最简单示例:您会在某个ChangeFeed上聆听更改(让它是一个简单的CLI应用程序,可以在终端中运行(,并且在您的情况下做任何您想做的事情从其他地方更改数据库(可能是内置的Web界面,recli,基于RethINKDB的应用程序等(。

我可以分享我以前在Java( Spring Framework(的经验中的简单现实生活示例,我第一次使用RethinkDB:想象您有一个文档转换REST服务,该服务仅接受某些文档并将其转换为图像,但您还希望在浏览器中实时监视转换状态。如何实施:

  • 休息服务可以接受多个连接以并行处理多个转换请求(当然必须是多线程(。这些请求将上传文档转换并将其转换状态保存到RethinkDB数据库中的特定表。
  • 另外,此REST服务在单独的" Forever"线程中使用r.changes()方法在RethINKDB数据库中的更改中听取该表的更改为了让您在网络浏览器中直接监视它们,而无需进行任何民意调查。您甚至不需要终止此线程,因为它是设计的"永远"。

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

最新更新