python多处理僵尸进程

python多处理僵尸进程,python,multiprocessing,zombie-process,Python,Multiprocessing,Zombie Process,我有一个python的多处理模块的简单实现 if __name__ == '__main__': jobs = [] while True: for i in range(40): # fetch one by one from redis queue #item = item from redis queue p = Process(name='worker '+str(i), target=worker, args=(item,))

我有一个python的多处理模块的简单实现

if __name__ == '__main__':
jobs = []

while True:
    for i in range(40):
        # fetch one by one from redis queue
        #item = item from redis queue
        p = Process(name='worker '+str(i), target=worker, args=(item,))

        # if p is not running, start p
        if not p.is_alive():
            jobs.append(p)
            p.start()

    for j in jobs:
        j.join()
        jobs.remove(j)


def worker(url_data):
    """worker function"""
    print url_data['link']
我希望这段代码能做什么:

  • 在无限循环中运行,一直等待Redis队列
  • 如果Redis队列不为空,则获取项目
  • 创建40个多进程。进程,不多不少
  • 如果某个进程已完成处理,则启动新进程,以便始终运行约40个进程
  • 我读到,为了避免应该绑定(加入)到父进程的僵尸进程,这是我在第二个循环中期望实现的。但问题是,在启动时,它会生成40个进程,工作人员完成处理并进入僵尸状态,直到所有当前生成的进程尚未完成, 然后在“while True”的下一次迭代中,相同的模式继续

    所以我的问题是:
    如何避免僵尸进程。并在每40个任务中就有1个完成后生成新流程。对于您描述的任务,通常最好使用不同的方法使用

    您可以让主进程获取数据,由工作人员处理

    下面是来自的
    池的示例

    我还建议使用
    imap
    而不是
    map
    ,因为您的任务似乎可以是异步的

    您的代码大致如下:

    p = Pool(40)
    
    while True:
      items = items from redis queue
      p.imap_unordered(worker, items) #unordered version is faster
    
    
    def worker(url_data):
      """worker function"""
      print url_data['link']
    

    工作非常完美,内存使用量比进程稍高,不过,我对python还是比较陌生的,您确定我应该使用池而不是进程吗?当然,这取决于您的具体任务。一般来说,你把工作推给了一群工人。在工人工作期间,你不需要直接与他们沟通。为此类场景创建了池。:)
    p = Pool(40)
    
    while True:
      items = items from redis queue
      p.imap_unordered(worker, items) #unordered version is faster
    
    
    def worker(url_data):
      """worker function"""
      print url_data['link']