Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何停止rabbitmq工作程序中间脚本?_Python_Node.js_Rabbitmq - Fatal编程技术网

Python 如何停止rabbitmq工作程序中间脚本?

Python 如何停止rabbitmq工作程序中间脚本?,python,node.js,rabbitmq,Python,Node.js,Rabbitmq,我的应用程序是如何结构化的node.js服务器将数据发送给python工作程序,然后启动一个不停的脚本。在稍后的时间里,如何使No.js服务器能够停止脚本并使该工作人员能够再次从队列中接收? < P>您可以考虑使用像芹菜这样的包来管理RabbMQ作为您的代理。芹菜有一个revoke()函数,可用于终止任务 >> from celery.task.control import revoke >> revoke(task_id, terminate=True) 由于听起来像

我的应用程序是如何结构化的node.js服务器将数据发送给python工作程序,然后启动一个不停的脚本。在稍后的时间里,如何使No.js服务器能够停止脚本并使该工作人员能够再次从队列中接收?

< P>您可以考虑使用像芹菜这样的包来管理RabbMQ作为您的代理。芹菜有一个
revoke()
函数,可用于终止任务

>> from celery.task.control import revoke
>> revoke(task_id, terminate=True)
由于听起来像是要停止已在处理中的任务,因此将terminate选项设置为True的revoke请求将终止已在执行的任务。默认情况下,这是false

供参考:

阻止消费者远离生产商的秘密通常是传达有毒信息

有些是通过多个队列来完成的,有些是通过一条专用消息来完成的,该消息被下游理解为停止消费(后者只适用于一个工作者)

基本上,当python脚本看到有毒消息时,它会立即关闭。您可能希望在单独的队列中使用此消息的原因是,如果您有多个工作线程,则可能需要广播消息,因此每个工作线程都需要一个独占队列

至于启动脚本,最好让工作人员继续运行,让他们等待重新启动消息

否则,您可以创建一个观察者工作者或控制器,它接收消息并控制进程,比如重新启动python脚本,但这相当复杂

我相信芹菜能起到很多作用,如果你正在寻找一些预先准备好的东西的话

编辑-毒药消息在AMQP中可能已经有其他含义。我的意思是你自己的毒信息

既然你想在它运行时杀死它,你就必须用广播的方式

对于每个使用者,实际上每个python脚本都有两个使用者

一个用于接受实际数据,另一个用于接收启动和停止数据使用者的命令

如果您想开始,您可以有一条广播消息(JSON,但您可以使用您喜欢的任何格式,也可以使用AMQP头属性):

当您想停止时,制作人可能会发送如下消息:

   {
      "command": "stop"
   } 
您的使用者回调将查看message.command=='stop'

一旦看到该消息,您就可以对实际接收数据的消费者调用
channel.basicCancel(consumerTag)
,并实际终止当前正在运行的任何内容。杀死当前正在运行的任何东西都高度依赖于您的设置,因此我无法真正深入讨论,因为它可能是一个单独的进程,或者如果使用某个事件引擎,它可能是一个单独的线程或事件。终止长时间运行的进程本身就很棘手

如果使用主题交换,或者您可以使用扇出(也称为广播)交换,则每个python脚本都应该为命令使用者拥有一个独占队列


数据使用者将与所有其他脚本共享一个队列。

从我查找的所有信息来看,当使用者无法处理消息时,似乎是有害消息。。这将如何帮助消费者停止消费?消费者甚至不会收到该消息,因为它已经在处理当前脚本,不是吗?很抱歉,我说的是毒药消息,因为AMQP可能会使用官方的毒药消息。这个词太多了。我所说的“毒药信息”是指你在你的终端上创建的一条定制信息,它标志着你的终端。
   {
      "command": "stop"
   }