2012-03-21 18 views
1

我想在python中创建独立的进程。这些进程是一个python脚本,我想拥有多个实例,但用不同的参数实例化。 简单地说,从一个for循环中,我打电话subprocess.Popen(),但与不同的ARGS相应:产生多个python进程/守护进程相同的名称(不同的参数)

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

在subscriber.py,我有代码“daemonizes”的过程按照各种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个实例!重要的是,我想要调用线程终止,离开这堆运行守护进程,运行..

我已经搜索了很多,在stackoverflow和其他地方,似乎无法找到一个类似的例子。也许它是我的蟒蛇新手 - 是我的方法完全不正确?

环境: - 的Python 2.7,Ubuntu Linux操作系统

+0

您是否尝试制作进程列表而不是重新分配变量?例如。 p.append(multiprocessing.Process(target = subscriber.start,args =(d.arg1,d.arg2,d.arg3))) – Serdalis 2012-03-21 06:12:11

+0

好的,但我想调用线程终止,留下一堆正在运行的守护进程背后。这就是为什么我倾向于Popen(),因为多处理似乎不允许子进程运行。 – lusito75 2012-03-21 06:18:14

回答

0

如果你并不真的需要一个唯一的Python的解决方案,一个微小的shell脚本可以做的工作:

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

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

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

+0

似乎表现相同的方式。如果我尝试从命令行使用> nohup subscriber.py xyz&手动启动subscriber.py,然后再> nohup subscriber.py abc&,.. ps命令仅显示subscriber.py运行的一个实例(abc版本)! – lusito75 2012-03-22 01:13:19

+0

这是否意味着subscriber.py控制可以存在多少个实例?另外,当'&'运行时,它会显示派生进程的PID(例如'nohup sleep 3&... [1] 31080'),并在完成时显示一条消息(例如,G。 '[1] + 31080完成nohup sleep 3')。你说'x y z'实例很快死亡。这意味着你应该看到这样的'[] + 完成...'消息。 – slavos 2012-03-22 06:27:21

0

2东西(除了附加的进程这是上面提到的列表):

  1. 设置守护=真真正意味着什么,你的对面期望。从手册:When a process exits, it attempts to terminate all of its daemonic child processes.。对!另外,deamons不能产生孩子。

这使我想到: 2.你应该做的是因为它产生的有守护=假的孩子,和他们每个人,在启动时,将使用守护进程fork()的。像这样:

def daemonize(): 

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


     return pid