执行之间的python多处理休眠

执行之间的python多处理休眠,python,python-multiprocessing,Python,Python Multiprocessing,我有一个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__

我有一个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”命令之间休眠吗

Abedin

看一看。创建项目列表,然后使用map将其提交到池中时,所有作业将一起提交到池中。因为您有20个工作进程,所以您的20个工作将(有效地)同时启动。这包括
sis
命令和sleep命令。甚至不能保证它们将以相同的顺序执行和完成,只能保证您将以相同的顺序收到结果。该函数可能更适合您,因为您可以控制作业何时提交到池中

在我看来,您似乎希望Python脚本在发出
sis
命令之前等待5秒钟,因此没有理由需要在工作进程中执行sleep命令。尝试重构为以下内容:

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
字符串中缺少了一个结束引号,可能还有一个“+”。不要手动构造字符串,请考虑使用:

如果反斜杠用于分隔路径层次结构,则应使用:

生成的第一个字符串(在任何一种情况下)将是:

nohup~/mycodes/code>1/out0.dat


我刚刚注意到这个问题几乎与你已经发布的问题完全相同。请删除两个帖子中的一个,以消除重复。对此,我深表歉意!完成后,我删除了重复的问题!谢谢你删除了副本。顺便说一句,我在您的问题中添加了Python标记,以便应用语法突出显示,这表明您的
sis=
字符串中缺少一个结束引号。我在我的答案中添加了一个关于字符串构造的注释,您可能会感兴趣。非常感谢您的解决方案!这正是我想要的。再次,@skrrgwsme非常感谢您使用字符串格式的建议。正如您所看到的,我对Python非常陌生,缺乏良好的代码格式。我希望我知道你的电子邮件,所以如果我有麻烦可以联系你,因为你似乎知道很多关于python的东西。特别是,我真的很喜欢你对我的problem.NP的优雅解决方案。每个人都必须从某个地方开始。您应该在某个时候结帐以获得有关代码的一些反馈。在提问之前一定要阅读他们的FAQ(他们只接受工作代码,不接受调试帮助),但他们可以提供关于代码格式的良好反馈,并提供使代码更地道的技巧。
sis = 'nohup ~/mycodes/code > {}/out{}.dat'.format(j, i)
import os
sis = os.path.join('nohup ~/mycodes/code > {}'.format(j), 'out{}.dat'.format(i))