当前位置: 首页 > 面试题库 >

如何杀死由多处理模块创建的僵尸进程?

訾晋
2023-03-14
问题内容

我是multiprocessing模块的新手。我只是尝试创建以下内容:我有一个工作是从RabbitMQ获取消息并将其传递到内部队列(multiprocessing.Queue)。然后,我想做的是:在收到新消息时生成一个进程。它可以工作,但是在完成工作后,它留下了一个僵尸进程,不会被其父进程终止。这是我的代码:

主要过程:

 #!/usr/bin/env python

 import multiprocessing
 import logging
 import consumer
 import producer
 import worker
 import time
 import base

 conf = base.get_settings()
 logger = base.logger(identity='launcher')

 request_order_q = multiprocessing.Queue()
 result_order_q = multiprocessing.Queue()

 request_status_q = multiprocessing.Queue()
 result_status_q = multiprocessing.Queue()

 CONSUMER_KEYS = [{'queue':'product.order',
                   'routing_key':'product.order',
                   'internal_q':request_order_q}]
 #                 {'queue':'product.status',
 #                  'routing_key':'product.status',
 #                  'internal_q':request_status_q}]

 def main():
     # Launch consumers
     for key in CONSUMER_KEYS:
         cons = consumer.RabbitConsumer(rabbit_q=key['queue'],
                                        routing_key=key['routing_key'],
                                        internal_q=key['internal_q'])
         cons.start()

     # Check reques_order_q if not empty spaw a process and process message
     while True:
         time.sleep(0.5)
         if not request_order_q.empty():
             handler = worker.Worker(request_order_q.get())
             logger.info('Launching Worker')
             handler.start()

 if __name__ == "__main__":
     main()

这是我的工人:

 import multiprocessing
 import sys 
 import time
 import base

 conf = base.get_settings()
 logger = base.logger(identity='worker')

 class Worker(multiprocessing.Process):

     def __init__(self, msg):
         super(Worker, self).__init__()
         self.msg = msg 
         self.daemon = True

     def run(self):
         logger.info('%s' % self.msg)
         time.sleep(10)
         sys.exit(1)

因此,在处理完所有消息之后,我可以看到带有ps aux命令的进程。但是我真的希望它们一旦完成就可以终止。谢谢。


问题答案:

有两件事:

  1. 确保父母joins的孩子,避免僵尸。请参阅Python多处理终止进程

  2. 您可以使用is_alive()成员函数检查孩子是否仍在运行。请参阅http://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process



 类似资料:
  • 问题内容: 我在前台启动了我的程序(守护程序),然后用杀死了它,但剩下一个僵尸,无法用杀死它。如何杀死僵尸进程? 如果僵尸是一个死进程(已被杀死),我如何将其从输出中删除? 问题答案: 僵尸已经死了,所以您无法杀死它。要清理僵尸,必须等待其父级等待,因此杀死父级应该可以消除僵尸。(父对象死后,僵尸将被pid 1继承,而pid 1将等待该僵尸并清除其在进程表中的条目。)如果守护程序正在生成成为僵尸的

  • 僵尸进程 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。 理解了孤儿进程和僵尸进程,我们临时加了守护进程这一小节,守护进程就是后台进程吗?没那么简单。

  • 本文向大家介绍Shell脚本实现查杀子进程、僵尸进程,包括了Shell脚本实现查杀子进程、僵尸进程的使用技巧和注意事项,需要的朋友参考一下 核心服务器上跑了一堆的脚本、程序,难免有时候会出现僵尸进程,死不死活不活的在那里占用资源,最初只是写了个根据关键字查杀进程的linux shell脚本,后来发现很多时候进程死在那里的时候其实是内部调用子进程的时候出现了问题,这时候光杀父进程根本没解决根本问题。

  • 问题内容: 首先是第一件事。我的系统信息和版本: 容器中的进程变成僵尸之后,我无法停止容器。升级到docker 0.9.0后,我在服务器上看到大量僵尸。例: 我可以看到 没有在节点进程25332上调用wait()来保持僵尸存活。所以我检查了strace在做什么,它似乎卡在了。stract实际上一开始就卡住了,只是显示了这一点: 但是在我运行sudo docker kill 3da5764b7bc9

  • 问题内容: 我在Go中有一个应用程序,它可以重新路由二进制文件的STDIN和STDOUT,然后运行它们。简而言之,我正在做: 我注意到,只要在运行命令A时退出命令B的进程,它就会在进程表中变成僵尸进程。 这是一个例子: 如果commandB仍在运行时退出,为什么commandB会变成僵尸?我在Ubuntu 14上运行Go 1.5。 问题答案: 当某个进程退出时,无论正在运行什么其他进程,它 总是

  • 上篇我整篇尬聊的都是 pcntl_fork(),只管 fork 生产,不管产后护理,实际上这样并不符合主流价值观,而且,操作系统本身资源有限,这样无限生产不顾护理,操作系统也会吃不消的。 孤儿进程是指父进程在 fork 出子进程后,自己先完了。这个问题很尴尬,因为子进程从此变得无依无靠、无家可归,变成了孤儿。用术语来表达就是,父进程在子进程结束之前提前退出,这些子进程将由 init(进程 ID 为