Python:OpenMPI与RabbitMQ

Python:OpenMPI与RabbitMQ,python,messaging,mpi,rabbitmq,amqp,Python,Messaging,Mpi,Rabbitmq,Amqp,假设有人有兴趣编写一个python应用程序,其中不同进程之间应该有通信。通信将通过发送字符串和/或numpy数组来完成 选择OpenMPI与使用RabbitMQ等工具相比,有哪些考虑因素?对于此类问题,没有单一正确答案。这完全取决于许多不同的因素。例如: 你有什么样的交流方式?您发送的是大数据包还是小数据包,您需要高带宽还是低延迟 你们需要什么样的交货保证 OpenMPI只能立即将消息传递给正在运行的进程,而不同的MQ解决方案可以对消息进行排队,并允许奇特的生产者-消费者配置 你们有什么样的网络

假设有人有兴趣编写一个
python
应用程序,其中不同进程之间应该有通信。通信将通过发送
字符串
和/或
numpy
数组来完成


选择
OpenMPI
与使用
RabbitMQ
等工具相比,有哪些考虑因素?

对于此类问题,没有单一正确答案。这完全取决于许多不同的因素。例如:

  • 你有什么样的交流方式?您发送的是大数据包还是小数据包,您需要高带宽还是低延迟
  • 你们需要什么样的交货保证
  • OpenMPI只能立即将消息传递给正在运行的进程,而不同的MQ解决方案可以对消息进行排队,并允许奇特的生产者-消费者配置
  • 你们有什么样的网络?如果您在本地主机上运行,像
    ZeroMQ
    这样的东西可能是最快的。如果在主机集上运行,则取决于可用的互连。例如,OpenMPI可以利用infiniband/mirynet链路
  • 你在做什么样的处理?使用MPI时,所有进程通常同时启动,执行处理并立即终止

  • 这正是我几个月前所处的场景,我决定使用AMQP和RabbitMQ,使用主题交换,以及memcache来处理大型对象

    AMQP消息都是JSON对象格式的字符串,因此很容易向消息添加属性(如重试次数)并重新发布。JSON对象是JSON的子集,对应于Python指令。例如{“recordid”:“272727”}是一个具有一个属性的JSON对象。我本可以编写一个Python dict,但这会将我们锁定为只在消息队列中使用Python

    大型对象不会被AMQP路由,而是进入memcache,在那里它们可以被另一个进程检索。你也可以使用Redis或Tokyo Tyrant来完成这项工作。我们的想法是,我们不希望短消息在大型对象后面排队

    最后,我的Python进程在架构的两个不同方面同时使用AMQP和ZeroMQ。您可能会发现,同时使用OpenMPI和AMQP是有意义的,但用于不同类型的作业


    在我的例子中,主管流程永远运行,启动一整群工人,他们也永远运行,除非他们死亡或被绞死,在这种情况下,主管重新启动他们。工作通过AMQP以消息的形式不断流入,每个流程只处理工作的一个步骤,因此当我们发现瓶颈时,我们可以在不同的机器上拥有多个流程实例来消除瓶颈。在我的例子中,一个过程有15个实例,另外两个过程有4个实例,还有大约8个单独的实例。

    方丈,谢谢你的回复。是的,我正在通过100台机器的网络发送
    大数据包
    (每个数MB);我有一个简单的1G网络。不花哨;可以有一点延迟——不一定是最快的。+1。一般来说,MPI适合在多个可靠节点(例如,集群中的节点,或实验室中的一堆PC)上运行单个大型任务。如上所述,当您不知道网络的类型,或者希望利用节点上内核之间的共享内存时,这也很好。离这种用例越远,MPI就越不适合。我要补充的是OpenMPI只是MPI的一种实现;另一个MPICH2也一样好。如果您打算使用MPI+Python,我建议您使用mpi4py。乔纳森,谢谢你。使用
    OpenMPI
    RabbitMQ
    相比有什么好处吗?当然有。这一切都取决于我回答的问题的答案。例如:如果RabbitMQ在具有Infiniband硬件的集群上运行,OpenMPI将在吞吐量和延迟方面将其撕成碎片。RabbitMQ确实允许简单的配置,比如多个生产者-多个消费者,而您需要编写大量的样板文件才能使用OpenMPI实现这一点。迈克尔,这是一个有趣的设计。谢谢分享。你也应该考虑一下序列化,它与ZrOMQ非常好。