2014-12-09 1 views
1

У меня есть скрипт python, который должен запускать несколько заданий параллельно. Я установил максимальные процессы на 20, но мне нужен сценарий, чтобы спать 5 секунд между отправкой заданий. Так вот мой пример кода:python многопроцессорный спящий режим между выполнением

#!/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) 

Хотя я спать 5 в между «лиза» команды, когда я бегу мой сценарий все задания начать немедленно. Мне нужно поспать между командами «sis», поскольку выход из каждого задания зависит от компьютерных часов. Поэтому, если я запускаю 20 заданий, все они начинаются с одних и тех же системных часов, и, следовательно, все они будут иметь одинаковый выход.

Любая идея, как заставить мой скрипт спать между командами 'sis'?

Абедин

+0

Я только заметил, что этот вопрос является почти точным дубликатом того, который вы уже разместили. Удалите один из двух сообщений, чтобы устранить дубликат. – skrrgwasme

+0

Извините! Сделал, я удалил дублированный вопрос! – user3578925

+1

Спасибо за удаление дубликата. BTW, я добавил тэг Python к вашему вопросу, чтобы подсветка синтаксиса была применена, и это показывает, что вы пропускаете закрывающий кавычек где-то в строке 'sis ='. – skrrgwasme

ответ

1

Посмотрите на docs for pool.map(). Когда вы создаете список предметов, а затем отправляете их в пул с помощью карты, все задания подаются вместе с пулом. Поскольку у вас есть 20 рабочих процессов, 20 из ваших заданий начнут (эффективно) все сразу. Это включает в себя как ваши команды sis, так и команды сна. Там даже нет гарантии, что они будут выполнены и завершены в том же порядке, что и вы получите результаты в том же порядке. Функция apply_async() может быть лучше для вас, потому что вы можете контролировать, когда задания подаются в пул.

Это звучит так, как будто вы хотите, чтобы ваш скрипт Python подождал 5 секунд, прежде чем вы введете команду sis, поэтому нет причин, по которым вам нужно будет выполнить команду 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 строке, и, вероятно, «+» тоже. Вместо того, чтобы вручную построения вашей строки, используйте 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)) 

Первая строка генерируется (в любом случае) будет :

поЬир ~/mycodes/код> 1/out0.dat

+0

Большое вам спасибо за ваше решение! Это именно то, что я искал. – user3578925

+0

Еще раз, @skrrgwasme благодарю вас за ваше предложение, используя форматирование строк. Как, возможно, вы можете видеть, что я довольно новичок в Python и не имею хорошего кода. Хотелось бы, чтобы я знал вашу электронную почту, поэтому, если я с трудом могу связаться с вами, поскольку вы, кажется, знаете много о питоне. В частности, мне очень понравилось ваше элегантное решение моей проблемы. – user3578925

+0

NP.Каждый должен начать где-то. Вы должны проверить [Code Review Stack Exchange] (http://codereview.stackexchange.com/), чтобы получить некоторую обратную связь по вашему коду. Обязательно прочитайте их FAQ перед тем, как задавать вопросы (они принимают только рабочий код - без помощи отладки), но они могут обеспечить хорошую обратную связь по форматированию кода и дать советы для того, чтобы сделать код более идиоматичным. – skrrgwasme