产生多个同名的python进程/守护进程(不同的args)

时间:2012-03-21 04:59:31

标签: python linux multiprocessing

我正在尝试在python中创建独立的进程。这些进程是一个python脚本,我希望有多个实例,但实例化了不同的参数。 简单地说,从for循环开始,我调用subprocess.Popen(),但args会相应变化:

for d in mylist:
    subprocess.Popen(['./subscriber.py', d.arg1, a.arg2, d.arg3])

在subscriber.py中,我有代码根据各种recipes“守护”流程 除此之外,我还试图用:

启动我的subscriber.py.
for d in mylist:
    p = multiprocessing.Process(target=subscriber.start,
                                args=(d.arg1, d.arg2, d.arg3))
    p.daemon=True
    p.start()

我的脚本还使用python日志记录来写入公共日志文件。

任何一种方法都会发生的事情是,只有我循环的最后一次迭代的过程才会实际运行。我需要的是让这些后台守护进程“永远”运行,但我只能得到1个实例! [编辑]重要的是,我希望调用线程终止,留下这一堆正在运行的守护进程,运行..

我已经googled远远地,在stackoverflow和其他地方,似乎找不到类似的例子。也许它是我的python新手......我的方法是完全错误的吗?

环境: - Python-2.7,ubuntu linux

2 个答案:

答案 0 :(得分:0)

2件事(除了将流程附加到上面提到的列表中):

  1. setting daemon = True实际上意味着与您期望的相反。来自手册:When a process exits, it attempts to terminate all of its daemonic child processes.。对!此外,守护不能产生孩子。
  2. 带我到: 2.你应该做的是生成具有守护进程= False的子进程,并且每个子进程在启动时将使用fork()进行守护。像这样:

        def daemonize():
    
            pid = os.fork()
            if pid != 0:
                sys.exit(0)
    
    
            return pid
    

答案 1 :(得分:0)

如果你真的不需要一个只有Python的解决方案,那么一个小的shell脚本可以完成这项工作:

while read ARGS; do
  nohup ./subscriber.py $ARGS &
done < mylist.txt

其中mylist.txt包含单独行上每个subscriber.py实例的参数。

nohup“守护”任何命令,&将其推送到后台。这意味着当产生该命令的会话结束时,nohup-ed命令将成为init进程的子进程(PID = 1)并继续运行。