在Perl中实现跨线程/进程队列

时间:2009-11-10 00:21:57

标签: mysql database perl

实现另一个线程/进程读取队列的最有效方法是什么?

我正在考虑使用一个基本的MySQL表来调查睡眠。这听起来是最具扩展性的(它甚至不必在同一台服务器上),但可能会导致对DB的查询过多。

3 个答案:

答案 0 :(得分:3)

您有多种选择,这实际上取决于您尝试让系统执行的操作。

  • fork子进程,以及使用stdin / stdout管道连接的接口。
  • 在文件系统上创建一个命名管道,例如/tmp/mysql.sock。这基本上是使用套接字来交流过程。
  • 设置消息代理。我建议您尝试使用 ActiveMQ 并使用Stomp client for Perl。这可能是您最具扩展性的解决方案。

答案 1 :(得分:2)

这是根据您的具体规格自行编写的简单内容之一。我在这里写了一个玩具:

http://github.com/jrockway/app-queue

我不确定它是否会再编译,因为AnyEvent :: Subprocess自写完以来发生了重大变化。但你可以窃取这些想法。

基本上,我认为RPC风格的基础设施是最好的。您有一个处理保持数据的服务器。然后客户端通过RPC调用连接并添加数据或删除数据。这为您提供了语义的最大灵活性。你可以是“事务性的”,这样如果客户端获取数据然后从不说“嘿,我完成了它”,你可以假设客户端已经死亡并将工作交给另一个客户端。您还可以确保每个作业只运行一次。

无论如何,使用关系数据库表使队列工作需要花费一些精力。你应该使用KiokuDB来表示持久性。 (如果需要,您可以将数据物理存储在MySQL中,但这为此提供了更好的Perl API。)

答案 2 :(得分:2)

在PostgreSQL中你可以使用NOTIFY / LISTEN组合,在运行LISTEN之后只需要等待PG连接套接字。