python多进程执行之间的睡眠

4 人关注

我有一个Python脚本,它应该并行地运行多个作业。我把最大进程设置为20个,但我需要脚本在发送作业之间睡眠5秒钟。 以下是我的示例代码。

#!/usr/bin/env python
import multiprocessing
import subprocess
def prcss(cmd):
    sbc = subprocess.call
    com = sbc(cmd, shell='True')
    return (com)
if __name__=='__main__':
    s = 'sleep 5'
    cmd= []
    for j in range(1,21):
        for i in range(10):
            sis = "nohup ~/mycodes/code > str(j)"+"/"+"out"+str(i)+".dat"
            cmd.append(sis)
            cmd.append(s)
    pool=multiprocessing.Pool(processes=20)
    pool.map(prcss,cmd)

虽然我在'sis'命令之间设置了sleep 5,但是当我运行我的脚本时,所有的工作都立即开始。我需要在'sis'命令之间设置睡眠,因为每个作业的输出都取决于计算机的时钟。因此,如果我运行20个作业,它们都以相同的系统时钟开始,因此它们都会有相同的输出。

有什么办法可以让我的脚本在'sis'命令之间进行休眠?

4 个评论
我刚刚注意到,这个问题几乎与你已经发布的一个问题完全重复了。请删除这两个帖子中的一个,以消除重复。
很抱歉!完成了,我删除了重复的问题!
谢谢你删除了重复的内容。BTW,我在你的问题中添加了Python标签,以便应用语法高亮,它显示你的 sis = 字符串中的某处缺少一个结束性引号。
我在答案中加入了一个关于弦结构的说明,你可能会感兴趣。
python
python-multiprocessing
user3578925
user3578925
发布于 2014-12-10
1 个回答
skrrgwasme
skrrgwasme
发布于 2014-12-12
已采纳
0 人赞同

请看一下 pool.map()的文档 .当你创建一个项目列表,然后使用map将它们提交给池子时,所有的作业都会一起提交给池子。因为你有20个工作进程,所以你的20个工作将一次性启动(有效)。这包括你的 sis 命令和睡眠命令。甚至不能保证它们会以相同的顺序被执行和完成,只是保证你会以相同的顺序收到结果。这就是所谓的 apply_async() 函数可能对你更好,因为你可以控制作业何时提交到池中。

在我看来,你希望你的 Python 脚本在发出 sis 命令之前等待 5 秒,所以你没有理由需要在工作进程中执行睡眠命令。试着把它重构为这样的东西。

import multiprocessing
import subprocess
import time
def prcss(cmd):
  # renaming the subprocess call is silly - remove the rename
  com = subprocess.call(cmd, shell='True') 
  return (com)
if __name__=='__main__':
  pool = multiprocessing.Pool(processes=20)
  results_objects = []
  for j in range(1,21):
    for i in range(10):
      sis = 'nohup ~/mycodes/code >'+str(j)+'/'+'out'+str(i)+'.dat'
      # make an asynchronous that will execute our target function with the
      # sis command
      results_objects.append(pool.apply_async(prcss, args=(sis,))
      # don't forget the extra comma in the args - Process must receive a tuple
      # now we pause for five sections before submitting the next job
      time.sleep(5)
  # close the pool and wait for everything to finish
  pool.close()
  pool.join() 
  # retrieve all of the results
  result = [result.get() for result in results_objects]

还有一点:由于应用了语法高亮,很容易看出你的sis字符串中缺少一个结束语,可能还有一个'+'。与其手动构建你的字符串,不如考虑使用string.format():

sis = 'nohup ~/mycodes/code > {}/out{}.dat'.format(j, i)

如果反斜杠是用来分隔路径层次的,你应该使用os.path.join():

import os
sis = os.path.join('nohup ~/mycodes/code > {}'.format(j), 'out{}.dat'.format(i))