子进程执行完成为僵尸进程,怎么解决

我有一脚本,去比较数据库和一个配置文件中一个商品的数量。少几个商品就开辟几个进程去创建商品、用的是subprocess.Popen 这个模块 在这个监控脚本中去创建子进程去执行一个创建的耗时操作。创建完子进程后,主进程所在的这个脚本就退出了 等待cronjob 定时任务下一次执行。少几个在创建几个。但是现在发现,创建的子线程在创建完商品。会成为僵尸进程、这个怎么解决。

我看了网上的说的 让主进程等wait() 但是我这里不能让主进程等。因为他子进程创建时一个耗时的操作,可能得好久。一个个等。主进程就没法发退出。那么监控脚本就不起作用的 就不能及时补充商品了。、
主进程的作用就是开辟进程 然后等待下次扫描创建少的数量的进程。

想问下大家怎么解决这种问题。父进程不用等待子进程结束,而不产生僵尸进程。

阅读 6.8k
2 个回答

调用signal(SIGCHLD, SIG_IGN)通知内核对子进程的结束不关心,由内核回收。

怎么感觉你描述的有问题呢?
创建完子进程后,主进程所在的这个脚本就退出了
当父进程先于子进程结束时,子进程会被init收养,成为孤儿进程,而非僵尸进程。

我们来测试一下:

import os
import sys
import time

pid = os.getpid()
ppid = os.getppid()
print 'im father', 'pid', pid, 'ppid', ppid
pid = os.fork()
if pid > 0:
    print 'father died..'
    sys.exit(0)

# 保证主线程退出完毕
time.sleep(1)
print 'im child', os.getpid(), os.getppid()

输出结果:

im father pid 32515 ppid 32015
father died..
im child 32516 1

看,子进程已经被pid为1的init进程接收了,所以僵尸进程在这种情况下是不存在的,存在只有孤儿进程而已,孤儿进程声明周期结束自然会被init来销毁。

我觉得你应该是概念方面理解错误,可能是你的子进程执行到某个阶段全部在某个地方给卡住了,实际上程序还没跑完所以被你认为是僵尸进程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏