0

我编写了一个小的 Python (2.7.2+) 模块(称为TWProcessing),它可以被描述为一个临时的批处理管理器。它的工作方式是我向它传递一长串命令,然后它将并行运行,但限制了同时处理的总数。这样,如果我有 500 个要运行的命令,它将遍历所有命令,但一次只运行 X 个命令,以免压倒机器。声明此批处理管理器的实例时可以轻松设置 X 的值(该类称为TWBatchManager):

batch = TWProcessing.TWBatchManager(MaxJobs=X)

然后,我以非常直接的方式向该对象添加作业列表:

batch.Queue.append(/CMD goes here/)

Queue批处理管理器将运行的命令列表在哪里。当队列被填满时,我然后调用Run()which 循环遍历所有命令,一次只运行 X :

batch.Run()

到目前为止,一切正常。现在我想做的是能够动态地更改 X 的值(即一次运行的最大进程数),即在进程仍在运行时。我这样做的旧方法相当简单。我有一个名为 MAXJOBS 的文件,该类会知道要查看它,并且如果它存在,它会定期检查它以查看所需的值是否已更改。现在我想尝试一些更优雅的东西。我希望能够export MAXJOBS=newX在启动包含批处理管理器的脚本的 bash shell 中编写一些东西,并让批处理管理器意识到这是它现在应该使用的 X 的值。显然os.environ['MAXJOBS']不是我要找的,因为这是一本在启动时加载的字典。os.getenv('MAXJOBS')也不会削减它,因为它export只会影响 shell 从那时起产生的子进程。所以我需要一种方法来回到启动我的 python 脚本的父进程的环境。我知道os.ppid会给我父 pid,但我不知道如何从那里到达父环境。我在 interwebz 上四处寻找,看看是否有一种方法可以让父 shell 修改子进程环境,我发现人们倾向于坚持我不要尝试这样的事情,以免我准备做一些电脑可以做的最丑陋的事情之一。

关于如何解决这个问题的任何想法?当然,我的“从标准文本文件读取”的想法并不那么难看,但我是 Python 新手,因此我试图挑战自己以优雅和干净的方式做事,尽可能多地学习。在此先感谢您的帮助。

4

1 回答 1

2

对我来说,您似乎要求在 bash 脚本和 python 程序之间进行进程间通信。

我不完全确定您的所有要求,但它可能是 FIFO(命名管道)的候选者:

1)制作先进先出:

mkfifo batch_control

2)启动python-server,它从fifo读取。(注意:以下只是一个简单的例子;你必须适应一些东西:

while True:
    fd = file("batch_control", "r")
    for cmd in fd:
        print("New command [%s]" % cmd[:-1])
    fd.close()

3) 从 bash 脚本中,您可以通过echo-ing 字符串到 fifo 中将内容“发送”到 python 服务器:

$ echo "newsize 800" >batch_control
$ echo "newjob /bin/ps" >batch_control

python服务器的输出是:

New command [newsize 800]
New command [newjob /bin/ps]

希望这可以帮助。

于 2012-04-12T14:29:40.780 回答